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
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("[email protected]");
-
- 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);
- System.out.println(user.getEmail());
-
- }
第二种方式:复合主键单独作为一个对象
UserId.java
-
-
-
- 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:
-
-
-
- public class User{
- private UserId id;
-
- private String email;
-
-
- public User() {
- }
-
-
- }
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("[email protected]");
-
- 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);
-
- System.out.println(user.getEmail());
- session.close();
-
- }