`
sarin
  • 浏览: 1748147 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
E3b14d1f-4cc5-37dd-b820-b6af951740bc
Spring数据库访问系列...
浏览量:172832
C2083dc5-6474-39e2-993e-263652d27795
Android学习笔记
浏览量:366569
5f40a095-b33c-3e8e-8891-606fcf3b8d27
iBatis开发详解
浏览量:188315
B272a31d-e7bd-3eff-8cc4-c0624ee75fee
Objective-C学习...
浏览量:98761
社区版块
存档分类
最新评论

Hibernate持久化对象的生命周期详解

阅读更多
    在Hibernate中,持久化对象在被操作过程中可以分为三个时期,这三个时期是和Session的周期相关的,因为Hibernate中的操作都是基于Session完成的。所以Session对象的生命周期也关系着持久化对象的生命周期。
    持久化对象的生命周期有三种,分别是瞬时态(Transient),持久态(Persistent)和脱管态(Detached)。
    瞬时态的对象是刚刚用new关键字创建出来的,还没有进入Session,此时的对象没有和数据库中的记录对应。示例代码如下:
	User user = new User();
	user.setName("Sarin");
	user.setCity("大连");
	user.setDepartment("研发部");
	user.setPhone("15912345678");
	user.setHireTime(new java.util.Date());

    这时user就是出于瞬时态的持久化对象。
    通过Session对象的save(),persist()或者saveOrUpdate()方法进行保存处于瞬时态的对象后,该对象就变为持久态。此时Session中已经存在该对象,并且对应数据库中的一条记录。值得注意的是在Session对象失效之前,对持久态对象的任何修改,在调用Session对象的close()方法或者Transaction对象的commit()方法之后,数据库表中对应的数据会同时更新。示例代码如下:
	SessionFactory sessionFactory = config.buildSessionFactory();
	Session session = sessionFactory.getCurrentSession();
	Transaction tx = session.beginTransaction();
	User user = new User();
	user.setName("Sarin");
	user.setCity("大连");
	user.setDepartment("研发部");
	user.setPhone("15912345678");
	user.setHireTime(new java.util.Date());
	session.save(user);
	tx.commit();

    在调用save()方法后,持久化对象user就变为持久态,但是执行了commit()方法之后,数据库操作才会进行,这点必须明确。所以在数据库操作执行之前对持久化对象的修改Hibernate可以感知。
    而且Session对象的get()和load()方法也可以返回一个持久态的对象,这个对象代表数据库表中的一条记录。
    脱管态,这个要格外注意,不是托管态,是离开Session管理的状态。处于脱管态的持久化对象的标识符属性和数据库表中某条记录的主键对应,但是它脱离了Session的管理,再次对其操作时,Hibernate无法感知其变化。如下示例:
	SessionFactory sessionFactory = config.buildSessionFactory();
	Session session = sessionFactory.getCurrentSession();
	Transaction tx = session.beginTransaction();
	User user = new User();
	user.setName("Sarin");
	user.setCity("大连");
	user.setDepartment("研发部");
	user.setPhone("15912345678");
	user.setHireTime(new java.util.Date());
	session.save(user);
	tx.commit();
	user.setCity("北京");

    虽然后来又修改了user对象的city属性,但是是在脱管态修改的,程序结束也不能再影响数据库中数据变化。处于脱管态的对象可以重新调用Session对象的update()方法回到持久态,否则Java虚拟机会在适当时间进行垃圾收集。重新持久化对象的过程如下:
SessionFactory sessionFactory = config.buildSessionFactory();
	Session session = sessionFactory.getCurrentSession();
	Transaction tx = session.beginTransaction();
	User user = new User();
	user.setName("Sarin");
	user.setCity("大连");
	user.setDepartment("研发部");
	user.setPhone("15912345678");
	user.setHireTime(new java.util.Date());
	session.save(user);
	tx.commit();
	user.setCity("北京");
	session = sessionFactory.getCurrentSession();
	tx = session.beginTransaction();
	session.update(user);
	tx.commit();

    当使用Session对象的delete()方法删除数据后,处于持久态的对象失去和数据库数据的对应关系,此时的持久化对象将在适当时间被Java虚拟机进行垃圾收集。
	SessionFactory sessionFactory = config.buildSessionFactory();
	Session session = sessionFactory.getCurrentSession();
	Transaction tx = session.beginTransaction();
	User user = (User) session.get(User.class, new Integer(1));
	session.delete(user);
	tx.commit();

    至此Hibernate中持久化对象的三种状态介绍完了。我们会发现处于瞬时态和脱管态的对象不在Hibernate的Session管理中,这时无论怎样修改对象的属性都不会影响数据库中的数据。而处于持久态的对象在Session对象执行close()方法或Transaction对象执行commit()方法时,数据库中数据会同步更新,这也是Hibernate对对象的“脏”数据进行检查的一种方式。
    本文系作者的个人理解,欢迎交流。
9
2
分享到:
评论
3 楼 iLidy 2016-05-22  
引用
[/c
[/flash][/flash][/flash][/flash][/flash][/flash][/flash][/flash][/flash][/flash]
||||||||||||||||||
|||||||||||||||||
|||||||||||||||||
||||||||||||||||
||||||||||||||||
[size=medium][/size]

|||||||||||||||
|||||||||||||||
||||||||||||||
||||||||||||||
|||||||||||||
|||||||||||||
||||||||||||
||||||||||||
|||||||||||
|||||||||||
||||||||||
||||||||||
|||||||||
|||||||||
||||||||
||||||||
|||||||
|||||||
||||||
||||||
|||||
|||||
||||
||||
|||
|||
||
||
|
|
ode]
2 楼 sarin 2011-09-05  
gaoyongbo026 写道
你好,谢谢你的分享
请问Session对象close()方法和Transaction对象执行commit()是什么关系呢,完成持久态数据数据更新的的动作是Session对象close()方法呢还是Transaction对象执行commit()方法呢

Session是一次会话的过程,而Transaction是一个会话中的一次事务,一个Session可以包含多个Transaction,就这样。
1 楼 gaoyongbo026 2011-09-05  
你好,谢谢你的分享
请问Session对象close()方法和Transaction对象执行commit()是什么关系呢,完成持久态数据数据更新的的动作是Session对象close()方法呢还是Transaction对象执行commit()方法呢

相关推荐

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     8.3 Java对象在Hibernate持久化层的状态  8.3.1 临时对象的特征  8.3.2 持久化对象的特征  8.3.3 被删除对象的特征  8.3.4 游离对象的特征  8.4 Session接口的详细用法  8.4.1 Session的save()和persist()...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     8.3 Java对象在Hibernate持久化层的状态  8.3.1 临时对象的特征  8.3.2 持久化对象的特征  8.3.3 被删除对象的特征  8.3.4 游离对象的特征  8.4 Session接口的详细用法  8.4.1 Session的save()和persist()...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     8.3 Java对象在Hibernate持久化层的状态  8.3.1 临时对象的特征  8.3.2 持久化对象的特征  8.3.3 被删除对象的特征  8.3.4 游离对象的特征  8.4 Session接口的详细用法  8.4.1 Session的save()和persist()...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     8.3 Java对象在Hibernate持久化层的状态  8.3.1 临时对象的特征  8.3.2 持久化对象的特征  8.3.3 被删除对象的特征  8.3.4 游离对象的特征  8.4 Session接口的详细用法  8.4.1 Session的save()和persist()...

    Hibernate实战(第2版 中文高清版)

     9.1 持久化生命周期   9.1.1 对象状态   9.1.2 持久化上下文   9.2 对象同一性和等同性   9.2.1 引入对话   9.2.2 对象同一性的范围   9.2.3 脱管对象的同一性   9.2.4 扩展持久化上下文   9.3 ...

    hibernate 框架详解

    长生命周期session和自动版本化 12.3.3. 脱管对象(deatched object)和自动版本化 12.3.4. 定制自动版本化行为 12.4. 悲观锁定(Pessimistic Locking) 13. 拦截器与事件(Interceptors and events) 13.1. 拦截...

    J2EE应用开发详解

    294 16.3.5 数据库连接池中使用JDBC 297 16.4 小结 302 第17章 ORM与Java持久化机制 303 17.1 ORM概述 303 17.2 域模型 304 17.3 实体域对象的持久化模式 304 17.4 JPA 305 17.4.1 实体 306 17.4.2 EntityManager ...

    低清版 大型门户网站是这样炼成的.pdf

    6.2.4 bean的作用域与生命周期 374 6.2.5 基于xml方式的bean装配 376 6.2.6 基于annotation方式的bean装配 381 6.2.7 基于xml方式的aop实现 386 6.2.8 基于annotation方式的aop实现 391 6.3 spring 2.5事务管理...

    Java Web程序设计教程

    3.3.3servlet的生命周期 49 3.3.4load-on-startupservlet 50 3.4自定义标签库 51 3.5预处理用户请求:filter 53 3.6使用listener 56 3.7项目实战——用户登录 59 本章小结 62 课后练习 63 第4章sql与jdbc ...

    Spring.3.x企业应用开发实战(完整版).part2

    3.5.2 ApplicationContext中Bean的生命周期 3.6 小结 第4章 在IoC容器中装配Bean 4.1 Spring配置概述 4.1.1 Spring容器高层视图 4.1.2 基于XML的配置 4.2 Bean基本配置 4.2.1 装配一个Bean 4.2.2 Bean的命名 4.3 ...

    Spring3.x企业应用开发实战(完整版) part1

    3.5.2 ApplicationContext中Bean的生命周期 3.6 小结 第4章 在IoC容器中装配Bean 4.1 Spring配置概述 4.1.1 Spring容器高层视图 4.1.2 基于XML的配置 4.2 Bean基本配置 4.2.1 装配一个Bean 4.2.2 Bean的命名 4.3 ...

    Spring-Reference_zh_CN(Spring中文参考手册)

    7.3.1. 通知的生命周期 7.3.2. Spring里的通知类型 7.3.2.1. 拦截around通知 7.3.2.2. 前置通知 7.3.2.3. 异常通知 7.3.2.4. 后置通知 7.3.2.5. 引入通知 7.4. Spring里的advisor(Advisor) API 7.5. 使用...

Global site tag (gtag.js) - Google Analytics