- 浏览: 623920 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
xianzi_2008:
xianzi_2008 写道楼主请教下,我缓存了一个List& ...
Ehcache -
xianzi_2008:
楼主请教下,我缓存了一个List<Bean>对象, ...
Ehcache -
jsdsh:
收藏好.五个字
hibernate之one-to-many详细 -
Tlife:
好!!!!
hibernate------HQL总结 -
yanqingluo:
例子很恰当。
观察者模式
1.hibernate中java对象的三种状态,三种状态都是对缓存而言的。
1)临时状态
New,delete()
不在session的缓存中,数据库中无对应的数据。
2)持久化状态
Save() 临时->持久
load(),get() 返回持久
update(),saveOrUpdate(),lock() 游离->持久
在session的缓存中,数据库中有对应的数据。
3)游离状态
Clear(),Close() 全部 持久->游离
Evict() 一个 持久->游离
不在session的缓存中,数据库中可能存在对应的数据
2.Session清理缓存的时间点
1)程序中调用net.sf.hibernate.Transaction的commit()方法的
时候
2)程序中调用session的find()或iterate()时,hibernate3里已经取消了find方法,如果任然需要使用则可以使用org.hibernate.classic.Session
3)程序中显示调用session的flush()方法时。session.close()不会清理
例子如下:
A:
session.beginTransaction().commit();和session.flush();只要其中任一条语句。结果都是一样的
B:
session.beginTransaction().commit();和session.flush();只要其中一条语句,结果是不一样的
session.beginTransaction().commit();//先提交,再清理缓存,即delete会在数据库里执行。
session.flush();//因为user为临时状态,不是持久化状态,所以flush()的时候只是清理缓存(也就是只对持久化状态的做同步),不会对user做同步,即delete不会在数据库里执行。
清理缓存时,和数据库同步,同步的也只是持久化状态的对象。
3.复合型主键两种实现方式
第一种,复合主键都做为属性
User.java
User.hbm.xml
使用方法:
第二种方式:复合主键单独作为一个对象
UserId.java
User.java:
User.hbm.xml:
和复合主键唯一不同的地方就是这句: <composite-id name="id" class="UserId">
使用方法:
1)临时状态
New,delete()
不在session的缓存中,数据库中无对应的数据。
2)持久化状态
Save() 临时->持久
load(),get() 返回持久
update(),saveOrUpdate(),lock() 游离->持久
在session的缓存中,数据库中有对应的数据。
3)游离状态
Clear(),Close() 全部 持久->游离
Evict() 一个 持久->游离
不在session的缓存中,数据库中可能存在对应的数据
2.Session清理缓存的时间点
1)程序中调用net.sf.hibernate.Transaction的commit()方法的
时候
2)程序中调用session的find()或iterate()时,hibernate3里已经取消了find方法,如果任然需要使用则可以使用org.hibernate.classic.Session
org.hibernate.classic.Session session = factory.openSession(); session.find("from User");
3)程序中显示调用session的flush()方法时。session.close()不会清理
例子如下:
A:
public void testUpdate(){ Session session = factory.openSession(); User user = (User)session.get(User.class, new Long("11")); user.setAddr("dalian"); user.setAddr("beijing"); // session.update(user);该条语句不要 // session.beginTransaction().commit();//会自动执行update语句,因为user此时是持久化状态 session.flush();//会自动执行update语句,因为user此时是持久化状态 session.close(); }
session.beginTransaction().commit();和session.flush();只要其中任一条语句。结果都是一样的
B:
public void testDelete(){ Session session = factory.openSession(); User user = (User)session.get(User.class, new Long("11")); session.delete(user);//user对象变为了临时状态 // session.beginTransaction().commit();//先提交,再清理缓存,即delete会在数据库里执行。 session.flush();//因为user为临时状态,不是持久化状态,所以flush()的时候只是清理缓存(也就是只对持久化状态的做同步),不会对user做同步,即delete不会在数据库里执行。 session.close(); }
session.beginTransaction().commit();和session.flush();只要其中一条语句,结果是不一样的
session.beginTransaction().commit();//先提交,再清理缓存,即delete会在数据库里执行。
session.flush();//因为user为临时状态,不是持久化状态,所以flush()的时候只是清理缓存(也就是只对持久化状态的做同步),不会对user做同步,即delete不会在数据库里执行。
清理缓存时,和数据库同步,同步的也只是持久化状态的对象。
3.复合型主键两种实现方式
第一种,复合主键都做为属性
User.java
import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; /** 该类必须是实现了Serializable接口,必须重写equals和hashCode方法 */ public class User implements java.io.Serializable { private String name; private String addr; private String email; public User() { } public String getEmail() { return this.email; } public void setEmail(String email) { this.email = email; } public String getAddr() { return addr; } public void setAddr(String addr) { this.addr = addr; } public String getName() { return name; } public void setName(String name) { this.name = name; } public boolean equals(Object other) { if ((this == other)) return true; if ((other == null)) return false; if (!(other instanceof UserId)) return false; User castOther = (User) other; return new EqualsBuilder().append(this.getName(), castOther.getName()) .append(this.getAddr(), castOther.getAddr()).append( this.getEmail(), castOther.getEmail()).isEquals(); } public int hashCode() { return new HashCodeBuilder().append(this.getName()).append( this.getAddr()).append(this.getEmail()).toHashCode(); } }
User.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="User" table="user" catalog="tie"> <composite-id> <key-property name="name" type="string"> <column name="name" /> </key-property> <key-property name="addr" type="string"> <column name="addr" /> </key-property> </composite-id> <property name="email" type="string"> <column name="email" not-null="true" /> </property> </class> </hibernate-mapping>
使用方法:
public void testCreate(){ User user = new User(); user.setName("test1"); user.setAddr("beijing"); user.setEmail("test1@xx.com"); Session session = factroy.openSession(); Transaction tx = session.beginTransaction(); session.save(user); tx.commit(); session.close(); } public void testLoad(){ User user = new User(); user.setName("test1"); user.setAddr("beijing"); Session session = factroy.openSession(); user = (User)session.load(User.class, user);//这里是user对象,非复合主键则是:User user = (User)session.load(User.class, new Long("1")); System.out.println(user.getEmail()); }
第二种方式:复合主键单独作为一个对象
UserId.java
/** 必须实现Serializable 接口,重写hashCode 方法和equals函数 */ public class UserId implements java.io.Serializable { private String name; private String addr; public UserId() { } public UserId(String name, String addr) { this.name = name; this.addr = addr; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public String getAddr() { return this.addr; } public void setAddr(String addr) { this.addr = addr; } public boolean equals(Object other) { if ( (this == other ) ) return true; if ( (other == null ) ) return false; if ( !(other instanceof UserId) ) return false; UserId castOther = ( UserId ) other; return new EqualsBuilder().append(this.getName(), castOther.getName()) .append(this.getAddr(), castOther.getAddr()).isEquals(); } public int hashCode() { return new HashCodeBuilder().append(this.getName()).append( this.getAddr()).toHashCode(); } }
User.java:
/** 该类不需要实现Serializable接口,也不需要重写equals和hashCode方法 */ public class User{ private UserId id; private String email; public User() { } //set and get method....... }
User.hbm.xml:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="User" table="user" catalog="tie"> <composite-id name="id" class="UserId"><!--is class ,not is type--> <key-property name="name" type="string"> <column name="name" /> </key-property> <key-property name="addr" type="string"> <column name="addr" /> </key-property> </composite-id> <property name="email" type="string"> <column name="email" not-null="true" /> </property> </class> </hibernate-mapping>
和复合主键唯一不同的地方就是这句: <composite-id name="id" class="UserId">
使用方法:
public void testCreate(){ UserId id = new UserId(); id.setName("test1"); id.setAddr("beijing"); User user = new User(); user.setId(id); user.setEmail("test1@163.com"); Session session = factroy.openSession(); Transaction tx = session.beginTransaction(); session.save(user); tx.commit(); session.close(); } public void testLoad(){ UserId id = new UserId(); id.setName("test1"); id.setAddr("beijing"); Session session = factroy.openSession(); User user = (User)session.load(User.class, id);//id是UserId对象,非复合主键则是:User user = (User)session.load(User.class, new Long("1")); System.out.println(user.getEmail()); session.close(); }
评论
2 楼
liliugen
2008-11-04
看了这篇文章我觉得收益蛮多的,回帖下,thanks
1 楼
410228573
2008-08-14
谢谢!!正好delete那个地方没弄懂!以为delete之后还是持久态!!现在基本弄清三个状态了。
发表评论
-
hibernate之one-to-many详细
2008-10-01 12:06 61351. 拿Classes和Student为例。 packag ... -
Hibernate中discriminator
2008-02-17 12:41 5980tbl_user 是一张表。User是它一个po,Normal ... -
hibernate总结二
2008-01-29 18:08 13951. get和load区别 load加载方法: Users ... -
hibernate总结
2008-01-28 18:07 20431.key是指外键 比如: <hibernate-m ... -
hibernate------one-to-one
2008-01-28 17:16 8450hibernate 关系映射 one-to-one主要有三种实 ... -
Hibernate-------集合
2008-01-28 13:47 2239Hibernate中的集合 Hibernate中的集合分为四类 ... -
hibernate------HQL总结
2008-01-25 15:07 9961以以个普通Users表为例: 建表语句: CREATE D ... -
hibernate-----many-to-many
2008-01-25 11:25 4366hibernate:many-to-many 以学生和老师为 ... -
hibernate----one-to-many
2008-01-21 17:58 4003hibernate里的一对多one-to-many(以学生和班 ... -
hibernate text
2007-10-22 17:40 2653mysql数据库的一个表里的字段logins是text类型的。 ... -
hibernate关系映射
2007-10-12 22:11 2814java 代码 package com ... -
hibernate 批量插入
2007-07-24 11:27 6691在企业应用开发中,经常用到批量插入的功能。对于Hibernat ...
相关推荐
### Hibernate知识点总结 #### 一、Hibernate概述 Hibernate是一个开源的ORM(Object Relational Mapping,对象关系映射)框架,用于Java应用与关系型数据库之间的交互。它通过使用描述对象和数据库之间映射的元...
通过理解并熟练运用这些知识点,J2EE开发者能有效利用Hibernate简化数据库操作,提高开发效率,并更好地维护代码。学习Hibernate不仅有助于入门J2EE开发,也是进一步深入学习Spring Data JPA等高级技术的基础。
Hibernate 框架是Java开发中广泛使用的对象关系映射(ORM)工具,它简化了数据库操作,使得开发者可以通过对象模型来处理数据,无需编写大量的SQL语句。本篇文章将深入探讨Hibernate的核心概念和基本使用方法。 ...
### Struts2+Spring+Hibernate知识点总结 #### Struts2框架概述 - **Struts2的工作流程**: 1. **客户端发起HTTP请求**:客户端浏览器向服务器发送HTTP请求。 2. **FilterDispatcher接收请求**:根据`web.xml`...
hibernate知识点的总结,适合初学者
【hibernate主要知识点】 Hibernate 是一款流行的 Java 平台上的 ORM(对象关系映射)框架,它使得开发者可以使用面向对象的方式处理数据库操作,而无需直接编写 SQL 语句。ORM 框架如 Hibernate、TopLink 和 OJB ...
Hibernate的知识点非常广泛,下面从给定文件的标题、描述、标签和部分内容中提炼出一些关键知识点进行总结。 ### Hibernate与数据库数据类型对照 Hibernate需要将Java的数据类型映射到数据库的相应类型。这部分...
**总结** Hibernate 作为一个强大的 ORM 框架,简化了数据库操作,提高了开发效率。通过理解 Hibernate 的配置、工具类使用、事务管理和数据类型映射,开发者能够更好地掌握 Hibernate,从而在实际项目中更加...
### Hibernate知识点总结 #### 一、Hibernate概述及入门 **1. HelloWorld** - **目的**:通过一个简单的示例,让初学者快速上手Hibernate,理解其基本工作流程。 - **步骤**: 1. 创建Java项目,命名为`...
以上总结了Hibernate的一些核心概念和面试中可能遇到的关键知识点。了解这些概念有助于更好地掌握Hibernate框架的使用,以及如何高效地利用Hibernate进行数据库操作。此外,对于面试者而言,熟悉这些概念也能帮助...
以下是对 Hibernate 框架的一些核心知识点的详细说明: 1. **@Transient**: 这个注解用于标记一个属性,表明该属性不会被映射到数据库中的任何列,因此不会进行持久化。 2. **@Temporal(TemporalType.TIME)**: 此...
【hibernate知识简介】 Hibernate 是一款流行的Java持久层框架,它主要负责处理对象与关系数据库之间的映射,实现对象关系映射(ORM),从而简化Java应用中的数据存取操作。ORM 解决了面向对象编程语言与关系型...
以下是关于Hibernate的一些关键知识点: 1. **JDBC对比Hibernate**: 传统的JDBC操作涉及手动建立和管理数据库连接,而Hibernate通过提供更高层次的抽象,自动处理这些细节,使得开发人员可以更专注于业务逻辑。 2....
【hibernate 重点知识】 一、hibernate 简介 Hibernate 是一个流行的 Java 应用程序框架,主要用于简化对象关系映射(ORM)的过程。它允许开发者使用面向对象的方式来操作数据库,通过自动映射数据库表为 Java ...
【hibernate的一点总结】 Hibernate 是一个流行的 Java ORM(对象关系映射)框架,它允许开发者使用面向对象的方式操作数据库,将Java类与数据库表进行映射,从而避免了直接编写SQL语句的繁琐工作。这个框架的核心...
### Hibernate关联映射总结 #### 一、基础知识 在探讨Hibernate中的关联映射之前,我们需要先理解几个基本概念,这将有助于我们更好地理解和应用这些关联映射。 - **主键**(Primary Key):主键是用来唯一标识一...
【Hibernate 知识整理】 1- Hibernate 是什么? Hibernate 是一个流行的对象关系映射(ORM)框架,它允许 Java 开发者用面向对象的方式来处理数据库交互。Hibernate 自动处理 SQL 转换和数据库访问,使得开发人员...
一、应用程序的分层结构 二、hibernate数据持久化组件 三、持久化类 四、把持久化类映射到表 五、持久化对象(Persistent Object) 六、Hibernate中实体关系的处理 七、Hibernate知识点总结 八、Hibernate控制的事务