hibernate对象状态

     瞬时(transient):数据库中没有数据与之对应,超过作用域会被jvm垃圾回收器回收,一般是new出来且与session没有关联的对象。

  持久(persistent):数据库中有数据与之对应,当前与session有关联,并且相关联的session没有关闭,事务没有提交;持久对象状态发生改变,在事务提交时会影响到数据库(hibernate能检测到)。

   脱管(detached):数据库中有数据与之对应,但当前没有session与之关联,脱管对象状态发生改变,hibernate不能检测到。

   hibernate对象状态_第1张图片


   

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.shizhan.hibernate.domain.UserBean;
import com.shizhan.util.HibernateUtil;



public class TestHibernate {
   
	public static void main(String[] args) {
		//我们刚创建了一个对象,数据库中没有记录相关联,是瞬时状态
		UserBean user = new UserBean();
		user.setUsername("shizhan");
		user.setPassword("123");
		
		//当我们调用了添加之后,数据库有记录与user关联了,可是session关闭了,这时候user的状态为脱管的
		add(user);
		UserBean u = get(1);
		System.out.println(u);
	}
	public static void add(UserBean user)
	{
		Session s =null;
		
		try{
			
		  s = HibernateUtil.getSession();
		  Transaction t = s.beginTransaction();
		  
		  //保存user之后,数据库中有和他相关的记录,且session没有关闭,他属于持久状态
		  s.save(user);
		  
		  //Hibernate: update UserBean set username=?, password=? where id=?
		  //hibernate会优化我们的更新操作,可以看到两个set操作,他只执行了一个update语句,他更新的时机是在
		   //事务提交之前的一小会
		  user.setUsername("heii");
		  user.setPassword("heii");
		  
		  t.commit();
		
		}finally{
		    s.close();
		}
	}
	public static UserBean get( int id)
	{
		Session s =null;
		UserBean u =null;
		try{
		  s= HibernateUtil.getSession();
		  u = (UserBean) s.get(UserBean.class,id);
		  
		}finally{
		   if(s!=null)
		   {
		      s.close();
		   }
		}
		return u ;
	}

}

  

你可能感兴趣的:(hibernate对象状态)