hibernate知识小结

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

Java代码 复制代码

 

org.hibernate.classic.Session session = factory.openSession();
session.find("from User");


3)程序中显示调用session的flush()方法时。session.close()不会清理

 

例子如下:
A:

Java代码 复制代码

 

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:

Java代码 复制代码
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

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

Java代码 复制代码
  1. <?xml version="1.0"?>   
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">   
  4.   
  5. <hibernate-mapping>   
  6.     <class name="User" table="user" catalog="tie">   
  7.         <composite-id>   
  8.             <key-property name="name" type="string">   
  9.                 <column name="name" />   
  10.             </key-property>   
  11.             <key-property name="addr" type="string">   
  12.                 <column name="addr" />   
  13.             </key-property>   
  14.         </composite-id>   
  15.         <property name="email" type="string">   
  16.             <column name="email" not-null="true" />   
  17.         </property>   
  18.     </class>   
  19. </hibernate-mapping>  

 

使用方法:

Java代码 复制代码
  1. public void testCreate(){   
  2.   
  3.     User user = new User();   
  4.     user.setName("test1");   
  5.     user.setAddr("beijing");   
  6.     user.setEmail("test1@xx.com");   
  7.        
  8.     Session session = factroy.openSession();   
  9.     Transaction tx = session.beginTransaction();   
  10.     session.save(user);   
  11.     tx.commit();   
  12.     session.close();   
  13. }   
  14.   
  15. public void testLoad(){   
  16.        
  17.     User user = new User();   
  18.     user.setName("test1");   
  19.     user.setAddr("beijing");   
  20.     Session session = factroy.openSession();   
  21.     user = (User)session.load(User.class, user);//这里是user对象,非复合主键则是:User user = (User)session.load(User.class, new Long("1"));   
  22.     System.out.println(user.getEmail());   
  23.        
  24. }  

 

第二种方式:复合主键单独作为一个对象
UserId.java

Java代码 复制代码
  1. /**  
  2. 必须实现Serializable 接口,重写hashCode 方法和equals函数  
  3. */  
  4. public class UserId  implements java.io.Serializable {   
  5.   
  6.      private String name;   
  7.      private String addr;   
  8.   
  9.     public UserId() {   
  10.     }   
  11.   
  12.     public UserId(String name, String addr) {   
  13.         this.name = name;   
  14.         this.addr = addr;   
  15.     }   
  16.   
  17.   
  18.     public String getName() {   
  19.         return this.name;   
  20.     }   
  21.        
  22.     public void setName(String name) {   
  23.         this.name = name;   
  24.     }   
  25.   
  26.     public String getAddr() {   
  27.         return this.addr;   
  28.     }   
  29.        
  30.     public void setAddr(String addr) {   
  31.         this.addr = addr;   
  32.     }   
  33.       
  34.   
  35.   
  36.   
  37.    public boolean equals(Object other) {   
  38.          if ( (this == other ) ) return true;   
  39.          if ( (other == null ) ) return false;   
  40.          if ( !(other instanceof UserId) ) return false;   
  41.          UserId castOther = ( UserId ) other;    
  42.             
  43.         return new EqualsBuilder().append(this.getName(), castOther.getName())   
  44.                 .append(this.getAddr(), castOther.getAddr()).isEquals();   
  45.    }   
  46.       
  47.    public int hashCode() {   
  48.          return new HashCodeBuilder().append(this.getName()).append(   
  49.                 this.getAddr()).toHashCode();   
  50.    }      
  51.   
  52. }  

 

User.java:

Java代码 复制代码
  1. /**  
  2. 该类不需要实现Serializable接口,也不需要重写equals和hashCode方法  
  3. */  
  4. public class User{   
  5.     private UserId id;   
  6.   
  7.     private String email;   
  8.   
  9.        
  10.     public User() {   
  11.     }   
  12.   
  13.     //set and get method.......   
  14. }  

User.hbm.xml:

Java代码 复制代码
  1. <?xml version="1.0"?>   
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">   
  4.   
  5. <hibernate-mapping>   
  6.     <class name="User" table="user" catalog="tie">   
  7.         <composite-id name="id" class="UserId"><!--is class ,not is type-->   
  8.             <key-property name="name" type="string">   
  9.                 <column name="name" />   
  10.             </key-property>   
  11.             <key-property name="addr" type="string">   
  12.                 <column name="addr" />   
  13.             </key-property>   
  14.         </composite-id>   
  15.         <property name="email" type="string">   
  16.             <column name="email" not-null="true" />   
  17.         </property>   
  18.     </class>   
  19. </hibernate-mapping>  

和复合主键唯一不同的地方就是这句: <composite-id name="id" class="UserId">

使用方法:

Java代码 复制代码
  1. public void testCreate(){   
  2.         UserId id = new UserId();   
  3.         id.setName("test1");   
  4.         id.setAddr("beijing");   
  5.         User user = new User();   
  6.         user.setId(id);   
  7.         user.setEmail("test1@163.com");   
  8.            
  9.         Session session = factroy.openSession();   
  10.         Transaction tx = session.beginTransaction();   
  11.         session.save(user);   
  12.         tx.commit();   
  13.         session.close();   
  14.            
  15.     }   
  16.        
  17.     public void testLoad(){   
  18.         UserId id = new UserId();   
  19.         id.setName("test1");   
  20.         id.setAddr("beijing");   
  21.            
  22.         Session session = factroy.openSession();   
  23.         User user = (User)session.load(User.class, id);//id是UserId对象,非复合主键则是:User user = (User)session.load(User.class, new Long("1"));   
  24.   
  25.         System.out.println(user.getEmail());   
  26.         session.close();   
  27.            
  28.     } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值