Hibernate中Java对象的三种状态及其转换

一、打开oracle数据库,登录scott账户,对scott账户进行测试

二、新建一个java项目,导入hibernate配置文件及scott账户下测试表的映射文件

1.创建java项目

2.打开DB Broweser,创建数据库连接

3.java项目中,先导入hibernate配置文件,再导入hibernate映射文件、映射类


导入hibernate映射文件、映射类

三、测试Hibernate中Java对象的三种状态及其转换

1.主方法

	/**
	 * 测试Hibernate中Java对象的三种状态<br/>
	 * 瞬时状态(Transient)<br/>
	 * 持久状态(Persistent)<br/>
	 * 游离状态(Detached)<br/>
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
//		t1();//java对象从瞬时状态转化为持久状态
//		t2();//java对象从瞬时状态转化为持久状态,在变为游离状态,对游离态的操作不会影响数据库
//		t3();//将游离对象使用update()重新关联到session,变为持久态
		t4();//将对象从持久状态变为瞬时状态,数据库中没有记录与其对应
	}
2.java对象从瞬时状态转化为持久状态
	/**
	 * java对象从瞬时状态转化为持久状态
	 */
	private static void t1() {
		//1.加载hibernate配置文件
		Configuration config = new Configuration().configure();
		//2.创建sessionFactory
		SessionFactory sessionFactory = config.buildSessionFactory();
		//3.打开session
		Session session = sessionFactory.openSession();
		//4.开启事务
		Transaction transaction = session.beginTransaction();
		//5.数据库操作
		
		//瞬时状态,数据库中没有记录与其对应
		Dept d = new Dept();
		d.setDname("111111");
		
		session.save(d);
		
		//对象d转换为持久态,数据库中一定有记录与其对应,并且对持久态的操纵就是对数据库的操作
		d.setDname("222222");
		
		//6.提交事务
		transaction.commit();
		//7.关闭session
		session.close();
		//8.关闭sessionFactory
		sessionFactory.close();
	}
运行:

查询:

可以看到数据库中新增了一条记录,并且插入的dname的值为222222,不是111111.再看hibernate的提示信息,先查询最大的deptno,再执行插入语句insert,最后执行一个更新语句update。说明new 一个瞬时对象d后,执行session.save()方法后变为持久对象,在通过d.setDname()对其操作,此时操作的就是持久态对象,操作持久态对象就是操作数据库,最终插入的值就是“222222”.

3.java对象从瞬时状态转化为持久状态,在变为游离状态,对游离态的操作不会影响数据库

	/**
	 * java对象从瞬时状态转化为持久状态,在变为游离状态,对游离态的操作不会影响数据库
	 */
	private static void t2() {
		//1.加载hibernate配置文件
		Configuration config = new Configuration().configure();
		//2.创建sessionFactory
		SessionFactory sessionFactory = config.buildSessionFactory();
		//3.打开session
		Session session = sessionFactory.openSession();
		//4.开启事务
		Transaction transaction = session.beginTransaction();
		//5.数据库操作
		
		//瞬时状态,数据库中没有记录与其对应
		Dept d = new Dept();
		d.setDname("111111");
		
		session.save(d);
		
		//对象d转换为持久态,数据库中一定有记录与其对应,并且对持久态的操纵就是对数据库的操作
		d.setDname("222222");
		
		//6.提交事务
		transaction.commit();
		//7.关闭session
		session.close();
		
		/**
		 * 当session关闭后,持久态对象就会变成游离状态<br/>
		 * 游离状态的特点是数据库可能有也可能没有记录对应<br/>
		 * 对游离对象进行的操作不会影响数据库<br/>
		 */
		d.setDname("333333");
		
		//8.关闭sessionFactory
		sessionFactory.close();
	}
运行结果:

查询数据库结果:



从查询数据库的结果可以看到,在session关闭后对其进行操作d.setDname("333333"),

数据库中的结果依然是之前的结果,“222222”。

因为session关闭后d对象变为游离态,对游离态操作不会影响数据库。


4.将游离对象使用update()方法重新关联到session,变为持久态对象

	/**
	 * 将游离对象使用update()重新关联到session,变为持久态
	 */
	private static void t3() {
		//1.加载hibernate配置文件
		Configuration config = new Configuration().configure();
		//2.创建sessionFactory
		SessionFactory sessionFactory = config.buildSessionFactory();
		//3.打开session
		Session session = sessionFactory.openSession();
		//4.开启事务
		Transaction transaction = session.beginTransaction();
		//5.数据库操作
		
		//瞬时状态,数据库中没有记录与其对应
		Dept d = new Dept();
		d.setDname("111111aaaaaa");
		
		session.save(d);
		
		//对象d转换为持久态,数据库中一定有记录与其对应,并且对持久态的操纵就是对数据库的操作
		d.setDname("222222bbbbbb");
		
		//6.提交事务
		transaction.commit();
		//7.关闭session
		session.close();
		
		/**
		 * 当session关闭后,持久态对象就会变成游离状态<br/>
		 * 游离状态的特点是数据库可能有也可能没有记录对应<br/>
		 * 对游离对象进行的操作不会影响数据库<br/>
		 */
		d.setDname("333333cccccc");
		
		//将游离对象使用update()重新关联到session,可以再次变为持久态对象
		Session s1 = sessionFactory.openSession();
		Transaction tx = s1.beginTransaction();
		s1.update(d);
		tx.commit();
		
		//8.关闭sessionFactory
		sessionFactory.close();
	}
运行结果:



查询数据库的结果:


可以看到,session关闭后操作d.setDname("333333cccccc");重新创建了一个session,执行是s1.update(d);将游离态变为持久态,插入数据“333333cccccc”.


5.将对象从持久状态变为瞬时状态,数据库中没有记录与其对应

	/**
	 * 将对象从持久状态变为瞬时状态,数据库中没有记录与其对应
	 */
	private static void t4() {
		//1.加载hibernate配置文件
		Configuration config = new Configuration().configure();
		//2.创建sessionFactory
		SessionFactory sessionFactory = config.buildSessionFactory();
		//3.打开session
		Session session = sessionFactory.openSession();
		//4.开启事务
		Transaction transaction = session.beginTransaction();
		//5.数据库操作
		
		//瞬时状态,数据库中没有记录与其对应
		Dept d = new Dept();
		d.setDname("aaaaaa");
		
		/**
		 * 执行session的save方法对象从瞬时状态变为持久状态<br/>
		 * 对持久状态的操作就是对数据库的操作
		 */
		session.save(d);
		
		/**
		 * 执行session的delete方法对象d变为瞬时状态<br/>
		 * 瞬时状态,数据库中没有记录与其对应
		 */
		session.delete(d);
		
		//6.提交事务
		transaction.commit();
		//7.关闭session
		session.close();
		
		/**
		 * 当session关闭后,持久态对象就会变成游离状态<br/>
		 * 游离状态的特点是数据库可能有也可能没有记录对应<br/>
		 * 对游离对象进行的操作不会影响数据库<br/>
		 */
		d.setDname("cccccc");
		
		//将游离对象使用update()重新关联到session,可以再次变为持久态对象
		Session s1 = sessionFactory.openSession();
		Transaction tx = s1.beginTransaction();
		s1.update(d);
		tx.commit();
		
		//8.关闭sessionFactory
		sessionFactory.close();
	}
运行结果:


查询数据库的结果:


可以看到执行session.delete(d)后,后面的操作都没有插入成功。瞬时对象用update不能变为持久对象。

四、总结

1.hibernate中Java对象的三种状态



2.hibernate中Java对象三种状态之间的转换





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值