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

来源:互联网 发布:淘宝店主首页寄语 编辑:程序博客网 时间:2024/05/22 14:40

一、打开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.创建sessionFactorySessionFactory sessionFactory = config.buildSessionFactory();//3.打开sessionSession 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.关闭sessionsession.close();//8.关闭sessionFactorysessionFactory.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.创建sessionFactorySessionFactory sessionFactory = config.buildSessionFactory();//3.打开sessionSession 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.关闭sessionsession.close();/** * 当session关闭后,持久态对象就会变成游离状态<br/> * 游离状态的特点是数据库可能有也可能没有记录对应<br/> * 对游离对象进行的操作不会影响数据库<br/> */d.setDname("333333");//8.关闭sessionFactorysessionFactory.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.创建sessionFactorySessionFactory sessionFactory = config.buildSessionFactory();//3.打开sessionSession 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.关闭sessionsession.close();/** * 当session关闭后,持久态对象就会变成游离状态<br/> * 游离状态的特点是数据库可能有也可能没有记录对应<br/> * 对游离对象进行的操作不会影响数据库<br/> */d.setDname("333333cccccc");//将游离对象使用update()重新关联到session,可以再次变为持久态对象Session s1 = sessionFactory.openSession();Transaction tx = s1.beginTransaction();s1.update(d);tx.commit();//8.关闭sessionFactorysessionFactory.close();}
运行结果:



查询数据库的结果:


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


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

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


查询数据库的结果:


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

四、总结

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



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





0 1
原创粉丝点击