Hibernate——对象的三大状态


为了测试的方便,写了一个小工具类(注意:在测试之前务必要到hibernate所需要使用的jar包)
public class HibernateUtils {
	private static SessionFactory factory;
	//ThreadLocal:线程的本地变量,内部是map集合key为线程值为指定的类型,
	//解决线程安全,保证每个线程都有自己的变量
	private static ThreadLocal<Session> local;
	static {
		factory=new Configuration().configure().buildSessionFactory();
		local=new ThreadLocal<>();
	}
	//安全的Session,保证了每个线程就一个Session
	public  static Session openSession() {
		//Thread.currentThread();
		if(local.get()==null) {
			local.set(factory.openSession());
		}
		return local.get();
	}
	
	public static Session getCurrentSession() {
		return factory.getCurrentSession();
	}
}

1)瞬时态/临时态——当前对象就是与session无关
——》 不能变为游离态
@Test
	public void test1(){
		Session session = HibernateUtils.openSession();
		User user = new User("tt","111",new Date());//临时态
//		如果save成功,则为持久态,如果save失败则为临时态
		System.out.println("保存:"+session.save(user));//持久态
		System.out.println(user.getId());//持久态
		session.close();
		System.out.println(user.getUsername());//游离态
	}


2)持久态——当前对象在session中,数据库有数据;持久态的对象的属性变化会在事务提交的时候,将变化结果更新到数据库
持久态——》游离态
close:关闭 清空缓冲区
clear:清空 清空缓冲区
evict:清除指定对象(一个)
持久态——》瞬时态
delete:删除
@Test
	public void test2(){
		Session session = HibernateUtils.openSession();
		Transaction tran = session.beginTransaction();
		User user = session.get(User.class, 1);//持久态
//		持久态的对象的属性变化会在事务提交的时候讲变化结果更新到数据库
//		session通信的管道:数据库与外界进行通信
		session.evict(user);//从缓冲区移除指定对象,游离态
//		session.clear();
		user.setPassword("222");//游离态:并没有对数据库中的内容进行修改操作
		User user2 = session.load(User.class, 2);
//		从数据库中删除并且从session中移除
		session.delete(user2);
		System.out.println(user2.getUsername());//瞬时态
//		在持久对象在属性内容发生变化时,也就是提交前,会自动调用update对其进行修改操作
		tran.commit();
		session.close();
	}


3)游离态——曾经与session有关,只是现在从session移除,数据库中有数据
游离态——》持久态
save、update、saveOrUpdate
游离态——》瞬时态
delete
@Test
	public void test3(){
		Session session = HibernateUtils.openSession();
		Transaction tran = session.beginTransaction();
		User user = session.get(User.class, 1);//持久态
		System.out.println(user);
		session.evict(user);//游离态
//		session.saveOrUpdate(user);//持久态
		session.delete(user);//瞬时态
		tran.commit();
		session.close();
 	}


也许图形能更加方便进行理解



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值