hibernate三种状态的转换

持久化对象的状态有三种:
1、临时状态
2、持久化状态
3、游离状态

持久化状态迁移图:
照着这个图调用相应方法即可完成状态的转换

在这里插入图片描述


(1)临时状态
使用new操作符初始化的对象状态是瞬时的。
不处于session的缓存中,不被任何一个session实例关联;在数据库中没有对应的记录。
进入临时状态:
通过new语句,它处于临时状态,此时在数据库中没有对应的记录。
session 的delete(方法能使一个持久化状态的对象或游离状态的对象转变为临时状态的对象。

//创建User对象
User user = new User();

(2)持久化状态
持久实例是任何具有数据库标识的实例。当事务提交时,通过执行SQL的INSERT、UPDATE和DELETE语句把内存中的状态同步到数据库中。
它位于session实例的缓存中,和数据库相关记录同步更新。

package co.test;

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

import com.User;

public class Test1{
	@Test//单元测试
	public void test1() {
		//加载配置文件
		Configuration config = new Configuration().configure();
		
		//根据配置文件创建会话工厂
		SessionFactory factory = config.buildSessionFactory();
		
		//根据会话工厂创建会话
		Session session =factory.openSession();
		
		//创建一个事物对象
		Transaction trans = session.beginTransaction();
		User user = new User();
		user.setUsername("小明");
		user.setPassword("123456");
		//将对象持久化到数据表中
		session.save(user);
	
		//提交事务
		trans.commit();
		
		//关闭会话
		session.close();
		
		//关闭工厂
		factory.close();	
	}	

后台在打印语句,说明数据插入成功:

Hibernate: insert into user20 (name, pwd) values (?, ?)

(3)游离状态
session关闭后,持久化状态对象就转变为游离对象,这个对象脱离了数据库,不受hibernate的管理,它不再位于session的缓存中。
由图可知游离状态的对象是由持久化对象转变过来的,稍微改进下上面的单元测试代码。

		User user = new User();
		user.setUsername("小明");
		user.setPassword("123456");
		//将对象持久化到数据表中
		session.save(user);
		
		session.evict(user);
		
		//session.delete(user);
		//session.close();
		//session.evict(user);

这样数据库后台就插入了空数据,表示有数据进来,但是没同步更新。
在这里插入图片描述


附加:
游离状态转回临时状态调用delete()测试效果:

		User user = new User();
		user.setUsername("小明");
		user.setPassword("123456");
		//将对象持久化到数据表中
		session.save(user);
		
		session.delete(user);
		//session.close();
		//session.evict(user);
Hibernate: insert into user20 (name, pwd) values (?, ?)
Hibernate: delete from user20 where id=?
01:53:02.958 [main] ERROR org.hibernate.engine.jdbc.batch.
internal.AbstractBatchImpl - HHH000352: Unable to release batch statement...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值