`

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

阅读更多

在Hibernate中,持久化对象在被操作过程中可以分为三个时期,这三个时期是和Session的周期相关的,因为Hibernate中的操作都是基于Session完成的。所以Session对象的生命周期也关系着持久化对象的生命周期。
    持久化对象的生命周期有三种,分别是瞬时态(Transient),持久态(Persistent)和脱管态(Detached)。
    瞬时态的对象是刚刚用new关键字创建出来的,还没有进入Session,此时的对象没有和数据库中的记录对应。示例代码如下:

Java代码 复制代码
  1. User user = new User();   
  2. user.setName("Sarin");   
  3. user.setCity("大连");   
  4. user.setDepartment("研发部");   
  5. user.setPhone("15912345678");   
  6. user.setHireTime(new java.util.Date());  
	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()方法之后,数据库表中对应的数据会同时更新。示例代码如下:

Java代码 复制代码
  1. SessionFactory sessionFactory = config.buildSessionFactory();   
  2. Session session = sessionFactory.getCurrentSession();   
  3. Transaction tx = session.beginTransaction();   
  4. User user = new User();   
  5. user.setName("Sarin");   
  6. user.setCity("大连");   
  7. user.setDepartment("研发部");   
  8. user.setPhone("15912345678");   
  9. user.setHireTime(new java.util.Date());   
  10. session.save(user);   
  11. tx.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无法感知其变化。如下示例:

Java代码 复制代码
  1. SessionFactory sessionFactory = config.buildSessionFactory();   
  2. Session session = sessionFactory.getCurrentSession();   
  3. Transaction tx = session.beginTransaction();   
  4. User user = new User();   
  5. user.setName("Sarin");   
  6. user.setCity("大连");   
  7. user.setDepartment("研发部");   
  8. user.setPhone("15912345678");   
  9. user.setHireTime(new java.util.Date());   
  10. session.save(user);   
  11. tx.commit();   
  12. user.setCity("北京");  
	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虚拟机会在适当时间进行垃圾收集。重新持久化对象的过程如下:

Java代码
  1. SessionFactory sessionFactory = config.buildSessionFactory();   
  2.     Session session = sessionFactory.getCurrentSession();   
  3.     Transaction tx = session.beginTransaction();   
  4.     User user = new User();   
  5.     user.setName("Sarin");   
  6.     user.setCity("大连");   
  7.     user.setDepartment("研发部");   
  8.     user.setPhone("15912345678");   
  9.     user.setHireTime(new java.util.Date());   
  10.     session.save(user);   
  11.     tx.commit();   
  12.     user.setCity("北京");   
  13.     session = sessionFactory.getCurrentSession();   
  14.     tx = session.beginTransaction();   
  15.     session.update(user);   
  16.     tx.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();
	user.setCity("北京");
	session = sessionFactory.getCurrentSession();
	tx = session.beginTransaction();
	session.update(user);
	tx.commit();


    当使用Session对象的delete()方法删除数据后,处于持久态的对象失去和数据库数据的对应关系,此时的持久化对象将在适当时间被Java虚拟机进行垃圾收集。

Java代码 复制代码
  1. SessionFactory sessionFactory = config.buildSessionFactory();   
  2. Session session = sessionFactory.getCurrentSession();   
  3. Transaction tx = session.beginTransaction();   
  4. User user = (User) session.get(User.classnew Integer(1));   
  5. session.delete(user);   
  6. tx.commit();  
	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对对象的“脏”数据进行检查的一种方式。
    本文系作者的个人理解,欢迎交流。

分享到:
评论

相关推荐

    精通Hibernate:Java对象持久化技术详解

    6. **实体生命周期管理**:Hibernate自动管理对象的状态,包括瞬态、持久化、托管和脱管四种状态,以及它们之间的转换。 7. **多对一、一对多、多对多关系映射**:Hibernate支持复杂的关联关系映射,如单向关联、...

    精通Hibernate:Java持久化对象技术详解[第二版]

    8. **实体生命周期**:详解Hibernate对对象状态的管理,包括瞬时态、持久态、游离态和脱管态,以及对象状态转换和事件监听器。 9. **多态和继承映射**:讲解如何处理类的继承关系,实现多态查询,包括单表继承、...

    精通 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持久化技术详解.孙卫琴.代码2

    **hibernate持久化技术详解** Hibernate是一款强大的Java对象关系映射(ORM)框架,它为开发者提供了在Java应用中操作数据库的强大工具。通过Hibernate,开发者可以将数据库操作转化为对Java对象的操作,大大降低了...

    hibernate:java持久化对象详解01

    本教程“hibernate:java持久化对象详解01”聚焦于理解Hibernate如何将Java对象持久化到数据库中。 首先,让我们了解一下什么是持久化对象。在Java中,持久化对象是指那些状态可以被保存到持久存储介质(如数据库)...

    精通 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()...

    hibernate3.2生命周期

    **hibernate3.2生命周期详解** Hibernate是一个强大的Java对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式处理数据。在Hibernate3.2版本中,实体对象经历了一系列的状态转换,这些...

    Java对象持久化技术详解

    根据提供的标题“Java对象持久化技术详解”及描述“Java对象持久化技术详解 hibernate的资料很少这个是本好书”,我们可以围绕Java对象持久化的概念、意义以及在Hibernate框架中的应用进行深入探讨。 ### Java对象...

    Hibernate执行持久层访问步骤

    1. 第一级缓存:Session内部维护的缓存,保存了Session生命周期内的对象,自动管理读写操作。 2. 第二级缓存:可选配置,通过插件如Ehcache实现,跨Session共享,提高性能。 以上就是Hibernate执行持久层访问的基本...

    Struts.2.Hibernate.Spring整合开发技术详解.rar

    Hibernate作为数据持久化工具,其SessionFactory通常由Spring管理,以便在需要时为Service层提供Session实例。 SSH整合开发的优势在于,它可以提供一个完整的解决方案,涵盖了从用户界面到数据库的整个应用架构。...

    hibernate核心API

    ### Hibernate核心API详解:持久化生命周期 #### 一、引言 Hibernate作为一款优秀的对象关系映射(Object Relational Mapping,简称ORM)框架,能够帮助开发者以面向对象的方式处理数据库中的数据,极大地简化了...

    精通hibernate源码ch5

    《精通Hibernate源码Chapter5:Java对象持久化技术详解》 在Java开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。深入理解Hibernate的源码,不仅能帮助开发者提高工作效率,还能...

    Hibernate缓存深入详解

    一级缓存中存储的对象是持久化对象,当对象的状态发生变化时,Session会自动同步更新数据库。在一级缓存中,对象的引用和数据库记录是一一对应的,这意味着对同一Session内的多次查询,即使没有对数据库的访问,也能...

    Hibernate帮助文档

    本文主要围绕Hibernate的核心API展开,包括持久化对象的生命周期、Session接口、Transaction接口以及SessionFactory接口。 1. **持久化对象的生命周期** Hibernate定义了三种状态来管理持久化对象:瞬时态、持久态...

    hibernate4快速入门实例详解

    Hibernate 能够帮助开发者更高效地处理数据持久化,提供对象和表之间的映射,以及数据查询和获取的方法,减少了手动编写 SQL 和 JDBC 代码的时间。对于以数据为中心、依赖存储过程实现业务逻辑的程序,Hibernate ...

Global site tag (gtag.js) - Google Analytics