javaEE Hibernate, 实体对象的三种状态

瞬时状态:没有id,没有在缓存session中
持久化状态:有id,在缓存session中
游离|托管状态:有id,没有在缓存session中

瞬时状态=>save=>根据主键生成策略生成id,并放到session缓存中=>持久化状态
瞬时状态=>setId()=>手动设置id=>游离|托管状态=>update()=>放到session缓存中=>持久化状态
持久化状态=>session.close()=>游离|托管状态
没有id(瞬时状态);有id(游离状态)=>saveOrUpdate()=>持久化状态
持久化状态=>提交事务=>真正保存到数据库中


Test.java:

package cn.xxx.demo;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

import cn.xxx.domain.Customer;
import cn.xxx.utils.HibernateUtils;

//对象的三种状态
public class Test {

	@Test
	//实体对象的三种状态
	public void fun1(){
		//1 获得session
		Session session = HibernateUtils.openSession();
		//2 控制事务
		Transaction tx = session.beginTransaction();
		//3执行操作
		Customer c = new Customer(); // 没有id, 没有与session关联 => 瞬时状态
		
		c.setCust_name("联想"); // 瞬时状态
		
		session.save(c); // 持久化状态, 有id,与session有关联
		
		//4提交事务.关闭资源
		tx.commit();  // 只有提交事务时,才会真正保存到数据库。
		session.close();// 游离|托管 状态, 有id , 没有关联
		
	}
	
	@Test
	//三种状态特点
	//save方法: 其实不能理解成保存.可以理解成将瞬时状态转换成持久状态的方法.(只是为了获取id)(根据主键生成策略生成id,执行任意的增删改查都会与session产生关联)
	//主键生成策略,主键自增(identity):执行save方法时,为了将对象转换为持久化状态.必须生成id值.所以需要执行insert语句生成.(提交事务才真正保存)
	//主键生成策略increment: 执行save方法,为了生成id.会执行查询id最大值的sql语句,并不会执行insert语句。(提交事务后才会真正保存到数据库)
	public void fun2(){
		//1 获得session
		Session session = HibernateUtils.openSession();
		//2 控制事务
		Transaction tx = session.beginTransaction();
		//3执行操作
		Customer c = new Customer(); // 没有id, 没有与session关联 => 瞬时状态
		
		c.setCust_name("联想"); // 瞬时状态
		
		session.save(c); // 持久化状态, 有id,有关联。并没有保存到数据库,只是根据id生成策略获取id;提交事务后才保存到数据库。
		
		//4提交事务.关闭资源
		tx.commit();
		session.close();// 游离|托管 状态, 有id , 没有关联
		
	}
	
	@Test
	//三种状态特点
	// 持久化状态特点: 持久化状态对象的任何变化都会自动同步到数据库中.
	public void fun3(){
		//1 获得session
		Session session = HibernateUtils.openSession();
		//2 控制事务
		Transaction tx = session.beginTransaction();
		//3执行操作
		
		Customer c = session.get(Customer.class, 1l); //持久化状态对象
		
		c.setCust_name("微软公司");  // 持久化状态的对象进行修改。提交事务后,会自动更新到数据库中。
		
		//4提交事务.关闭资源
		tx.commit();  
		session.close();// 游离|托管 状态, 有id , 没有关联
		
	}
}

HibernateUtils.java(Hibernate连接数据库的工具类):

package cn.xxx.utils;
 
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
 
public class HibernateUtils {
	private static SessionFactory sf;  // 一个web中只需要一个SessionFactory对象。
	
	static{
		//1 创建Configuration对象,默认加载src下的hibernate.cfg.xml配置文件
		Configuration conf = new Configuration().configure();
		//2 根据配置信息,创建 SessionFactory对象
		 sf = conf.buildSessionFactory();
	}
	
	//获得session => 获得全新session
	public static Session openSession(){
		//3 获得session
		Session session = sf.openSession();
		return session;
	}
	
	//获得session => 获得与线程绑定的session(当前session)
	public static Session getCurrentSession(){
		//3 获得session
		Session session = sf.getCurrentSession();
		
		return session;
	}
}



猜你喜欢

转载自blog.csdn.net/houyanhua1/article/details/81052880