`

hibernate之实体对象生命周期

阅读更多

在Hibernate的应用中,实体对象的生命周期,是一个关键的概念,这里的实体对象指的是Hibernate O/R映射关系中的域对象(即O/R中的“O”);

实体对象的三种状态:

  • 自由状态(Transient)

所谓的Transient,即实体对象在内存中的自由存在,它与数据库无关 ;如:

			TUser user = new TUser();;
			user.setName("keith ");
			user.setAge(new Integer(18));
			user.setInfo("the stu No is:");

 此时的user对象,只是在内存中存在,并没有和数据库想关联;

  • 持久状态(Persistent)

所谓的Persistent,即实体对象在hibernate管理的状态下,在这种状态下,实体对象的引用被纳入hibernate实体容器中加以管理;处于Persistent状态的对象,会由hibernate固化到数据库中;如:

session.save(user);
session.getTransaction().commit();

 当session调用save()时,已经将user这个对象纳入hibernate的管理,当session获取transaction并提交时,就将这个对象固化到了数据库中;

当我们需要将某一条数据调出时,可以这样:

session.load(TUser.class, new Integer(1));
session.getTransaction().commit();

 当session.load()时(也就是一个实体对象由Hibernate加载),那么此时它也是处于persistent状态;简单的说:如果一个实体对象与某个session实例发生了关联,并处于这个session的有效期内,那么它就处于persistent状态;

  • 游离状态(Detached)

当一个对象处于某个session的实例范围之外,那么这个对象就处于游离状态!(处于persistent状态下的对象,其对应的session实例关闭之后,那么此对象就处于Detached状态 );如:

		session.close();
		//此时的对象已经处于游离(Detached)状态

 也可以这么看,Session实例是Persistent状态下对象的宿主,宿主消失了,其对象就没有什么可依靠的了,就成为游离状态(Detached);

 

那么,Detached状态和Persistent状态有什么区别呢?

区别在于处于Detached状态下的对象可以再找一个宿主(与某个session实例对象想关联,而成为persistent对象),也就会再次变成Persistent状态,而处于Persistent状态下的对象,如果其宿主还在,那么它就没有必要再重新去找一个新的宿主;

 

一个对象会由Transient--->Persisent--->Detached;那么这个过程中处于Detached状态的user和处于Transient状态的user有什么变化?既然一个Detached对象与hibernate容器无关了,那么两者之间还有什么差异?

再回顾下代码:

			//创建了Transisent状态的user对象
                        TUser user = new TUser();
			user.setName("keith ");
			user.setAge(new Integer(18));
			user.setInfo("the stu No is");
                        //借助save()方法,将其转变为persisent状态
			session.save(user);

 关键在于,在session.save()方法执行过程中,User对象的内容已经发生了改变,当user对象处于Transisent状态下时,我们为它设定了一些属性,此时这个user对象所包含的数据信息也仅限于此,它于数据库中的记录没有任何对应关系;而当执行save()方法之后,Hibernate对user对象进行了持久化,并为其赋予了其相应的值,这个时候user对象自然就与数据库中的记录相对应了!

 

这就是前后两个状态user对象之间的基本差异:Transisent状态的user对象与数据中的数据缺乏对应关系,而Detached状态的对象,与库表中存在想对应的记录,但是Detached对象脱离了session这个数据管理平台,其状态的变化无法更新到数据库中;

 

VO与PO

为了方便,将处于Transisent状态和Detached状态下的对象称为值对象,即VO(Value Object);将处于Persisent状态的对象称为持久对象,即PO(Persisent Object);这是站在“实体对象是否被纳入hibernate管理容器”的立场上区分,非管理的实体对象成为VO,被管理的对象成为PO;

VO与PO的区别:

1,VO是相对独立的对象,处于非管理状态;

2,PO是hibernate纳入其管理容器的对象,代表与数据库中某条记录的hibernate实体,PO的变化是在事务提交时将反映到实际数据库中;

3,如果一个PO与其对应的session实例分离,那么此时就会变成一个VO;

 

分享到:
评论

相关推荐

    测试实体对象的生命周期

    在IT行业中,尤其是在Java开发领域,实体对象的生命周期管理是至关重要的一个环节,尤其是在使用ORM(Object-Relational Mapping)框架如Hibernate时。本文将详细探讨“测试实体对象的生命周期”,并结合给定的标签...

    hibernate的生命周期

    **hibernate的生命周期** Hibernate 是一款强大的Java对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据库事务。在Hibernate中,每个持久化对象都有一个生命周期,...

    hibernate操纵实体对象

    `HibernateSessionFactory`通常在应用启动时初始化一次,然后在整个应用生命周期中复用,以提高性能。创建`SessionFactory`通常涉及配置Hibernate的XML文件,其中包含了数据库连接信息、实体映射等设置。 `...

    hibernate session生命周期示例

    Session对象负责管理实体对象的状态,包括保存、更新、删除和检索数据。它的生命周期主要包括以下几个阶段: 1. **创建Session**: 当我们调用`SessionFactory.openSession()`方法时,一个新的Session实例就会被...

    hibernate3.2生命周期

    总结,理解Hibernate3.2中的对象生命周期是有效使用Hibernate的关键。正确管理对象状态,能够避免数据丢失,提高应用程序性能,并减少潜在的并发问题。深入源码和使用专业工具能进一步提升开发效率。

    hibernate中的对象关系模型

    在Hibernate中,通过`@ManyToOne`或`@OneToOne`注解表示,但需要注意的是,聚合关系通常不会影响对象的生命周期。 这些关系模型在Hibernate中通过注解或者XML配置文件进行定义,以实现Java对象和数据库记录之间的...

    08 领域对象的生命周期 102-116.rar

    9. **生命周期方法**:在某些编程语言和框架中,领域对象可能包含一些生命周期方法,如 `save()`、`delete()`、`load()` 等,用于操作对象的生命周期。 10. **CQRS(命令查询责任分离)**:在复杂系统中,CQRS 模式...

    Hibernate 操纵持久化对象

    一旦一个对象被持久化,它就处于Hibernate的管理之下,其生命周期将与数据库记录绑定。Hibernate提供了四种对象状态:瞬时态、持久态、脱管态和临时态,理解这些状态对于有效操纵持久化对象至关重要。 **三、配置...

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

     23.1.1 Session对象的生命周期与本地线程绑定  23.1.2 Session对象的生命周期与JTA事务绑定  23.2 实现对话  23.2.1 使用游离对象  23.2.2 使用手工清理缓存模式下的Session  23.3 小结  23.4 思考题 第24章...

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

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

    Hibernate实体层设计

    理解并掌握这些状态,可以帮助我们更好地控制对象的生命周期,避免数据不一致。 在实体层设计中,还要考虑性能优化。例如,通过懒加载(Lazy Loading)策略,我们可以延迟加载关联的对象,以减少数据库查询次数。...

    Hibernate中的实体状态及转换

    2. **持久化状态(Persistent)**:当实体对象被加入到Session的管理范围,即在Session的生命周期内,就进入了持久化状态。这意味着对象与数据库中的记录建立了绑定,任何对实体对象的修改都会在Session flush时同步到...

    《深入浅出Hibernate》读书笔记

    总之,《深入浅出Hibernate》读书笔记涵盖了实体对象生命周期的转换、实体对象的识别机制以及Hibernate的多级缓存策略,这些都是理解并有效使用Hibernate的关键点。通过深入学习这些概念,开发者能够更好地掌握...

    Hibernate 对象持久化

    在Hibernate中,对象的生命周期包括瞬时态、托管态、持久态和脱管态。通过Hibernate,我们可以轻松地将对象从内存中保存到数据库,或者从数据库中加载到内存。 **三、Hibernate配置** 使用Hibernate,首先需要配置...

    Hibernate的高级操作[归纳].pdf

    首先,让我们详细解析Hibernate的实体对象生命周期。 在Hibernate中,实体对象经历了三种不同的状态,它们分别是: 1. **Transient(自由状态)**:这是对象在内存中创建但尚未与数据库记录关联的状态。在代码示例...

    hibernate3必要jar包

    8. **实体生命周期**:Hibernate管理实体的生命周期,包括瞬时态、持久态、托管态和脱管态,以及相应的转换过程。 9. **DAO(Data Access Object)模式**:在实际应用中,通常会结合DAO模式使用Hibernate,创建专门...

    hibernate对象三状态及OneToOne&OneToMany&ManyToMany

    一旦对象变为持久态,Hibernate会负责它的生命周期管理,包括插入、更新和删除操作。 二、一对一(OneToOne)关系映射 在数据库设计中,一对一关系意味着两个实体表之间存在唯一映射。在Hibernate中,可以通过@...

    Hibernate原理解析

    Hibernate管理着对象的生命周期,包括初始化、持久化、脱管和删除。通过回调方法如`@PrePersist`、`@PostLoad`等,开发者可以在特定生命周期阶段执行自定义逻辑。 通过仿写Hibernate的持久层框架,我们可以更好地...

    hibernate 3.6 中文 chm

    9. **实体生命周期**:Hibernate管理对象的生命周期,包括瞬时态、持久态、托管态和游离态。理解这些状态转换有助于避免编程陷阱。 10. **一对多、多对一、一对一和多对多关系映射**:Hibernate支持多种关联映射,...

Global site tag (gtag.js) - Google Analytics