实体对象的生命周期在Hibernate应用中是一个很关键的概念,正确的理解实体对象的生命周期将对我们应用Hibernate做持久层设计起到很大的作用.而所谓的实体对象的生命周期就是指实体对象由产生到被GC回收的一段过程.在这过程中我们需要理解的就是实体对象生命周期中的三种状态.
1.自由状态(Transient)
所谓的Transient状态,即实体对象在内存中自由存在,与数据库中的记录无关,通常是我们的J2EE中VO,并没有被纳入Hibernate的实体管理容器.
1 Test test = new Test();
2 test.setName("energykk");
3 //此时的test对象处于Transient(自由状态)并没有被Hibernate框架所管理
4
2.持久状态(Persistent)
何谓 Persistent? 即实体对象已经处于被Hibernate实体管理容器容器所管理的状态.这种状态下这个实体对象的引用将被纳入Hibernate实体管理容器容器所管理.
处于Persistent状态的实体对象,对它的变更也将被固化到数据库中.
在J2EE中通常指的是一个PO.(相当于Struts中的BO)
Transaction tr = session.beginTransaction();
session.save(test);
//此时的test对象已经处于Persistent(持久状态)它被Hibernate纳入实体管理容器
tr.commit();
Transaction tr2 = session.beginTransaction();
test.setName("xukai");
//在这个事务中我们并没有显示的调用save()方法但是由于Persistent状态的对象将会自动的固化到
//数据库中,因此此时正处在Persistent状态的test对象的变化也将自动被同步到数据库中
tr2.commit();
处于Persistent状态的实体可以简单的理解为:如果一个实体对象与session发生了关联,并且处于session的有效期内,那么这个实体对象就处于Persistent状态.
3.游离状态(Detached)
处于Persistent状态的实体对象,其对应的session关闭以后,那么这个实体就处于Detached状态.
我们可以认为session对象就是一个Persistent的宿主,一旦这个宿主失效,那么这个实体就处于Detached状态.
session.close();
//与test对象关联的session被关闭,因此此时的test对象进入Detached(游离状态)
session2 = HibernateSessionFactory.getSession();
Transaction tr3 = session2.beginTransaction();
session2.update(test);
//此时正处于Detached状态的test对象由于再次借助与session2被纳入到Hibernate的实体管理容器所以此时的
//test对象恢复到Persistent状态
test.setName("jjjj");
tr3.commit();
session2.close();
既然Transient状态的实体与Detached状态的实体都与Hibernate的实体管理容器没有关系,那他们到底存在哪些差异?
差异就在于处于Transient状态的只有一个Name的属性.此时的test对象所包含的数据信息仅限于此,他与数据库中的记录没有任何瓜葛.
但是处于Detached状态的实体已经不止包含Name这个属性,还被赋予了主键也就是通常POJO里的id属性,由于id是主键,他可以确定数据库表中的一条
唯一的记录,那么自然的处于Detached状态的实体就能与数据库表中拥有相同id的记录相关联.
这就是他们之间所存在的差异,简而言之,Transient状态的实体缺乏与数据库表记录之间的联系,而Detached状态的试题恰恰相反.只不过是脱离了session这个数据库操作平台而已.
分享到:
相关推荐
在IT行业中,尤其是在Java开发领域,实体对象的生命周期管理是至关重要的一个环节,尤其是在使用ORM(Object-Relational Mapping)框架如Hibernate时。本文将详细探讨“测试实体对象的生命周期”,并结合给定的标签...
在Hibernate中,每个持久化对象都有一个生命周期,理解这些生命周期状态对于优化性能和正确管理数据库记录至关重要。 **一、持久化对象的状态** 1. **瞬时态(Transient)**:对象刚刚被创建,尚未与Session关联,...
`HibernateSessionFactory`通常在应用启动时初始化一次,然后在整个应用生命周期中复用,以提高性能。创建`SessionFactory`通常涉及配置Hibernate的XML文件,其中包含了数据库连接信息、实体映射等设置。 `...
Session对象负责管理实体对象的状态,包括保存、更新、删除和检索数据。它的生命周期主要包括以下几个阶段: 1. **创建Session**: 当我们调用`SessionFactory.openSession()`方法时,一个新的Session实例就会被...
在Hibernate中,通过`@ManyToOne`或`@OneToOne`注解表示,但需要注意的是,聚合关系通常不会影响对象的生命周期。 这些关系模型在Hibernate中通过注解或者XML配置文件进行定义,以实现Java对象和数据库记录之间的...
总结,理解Hibernate3.2中的对象生命周期是有效使用Hibernate的关键。正确管理对象状态,能够避免数据丢失,提高应用程序性能,并减少潜在的并发问题。深入源码和使用专业工具能进一步提升开发效率。
Hibernate允许开发者定义对象的生命周期回调方法,如preInsert()、postInsert()、preUpdate()等,以便在对象状态改变时执行特定的业务逻辑。 **九、懒加载与立即加载** 懒加载(Lazy Loading)是一种优化策略,只在...
2. **持久化状态(Persistent)**:当实体对象被加入到Session的管理范围,即在Session的生命周期内,就进入了持久化状态。这意味着对象与数据库中的记录建立了绑定,任何对实体对象的修改都会在Session flush时同步到...
8.1 Java对象在JVM中的生命周期 8.2 理解Session的缓存 8.2.1 Session的缓存的作用 8.2.2 脏检查及清理缓存的机制 8.3 Java对象在Hibernate持久化层的状态 8.3.1 临时对象的特征 8.3.2 持久化对象的...
6. **实体生命周期管理**:Hibernate自动管理对象的状态,包括瞬态、持久化、托管和脱管四种状态,以及它们之间的转换。 7. **多对一、一对多、多对多关系映射**:Hibernate支持复杂的关联关系映射,如单向关联、...
理解并掌握这些状态,可以帮助我们更好地控制对象的生命周期,避免数据不一致。 在实体层设计中,还要考虑性能优化。例如,通过懒加载(Lazy Loading)策略,我们可以延迟加载关联的对象,以减少数据库查询次数。...
12. **实体生命周期**:阐述了Hibernate中实体的生命周期状态(瞬时、持久化、脱管和临时),以及状态转换和事件监听。 13. **性能优化**:提供了一些最佳实践和技巧,如批处理、延迟加载、缓存配置等,以提高...
9. **实体生命周期**:Hibernate管理对象的生命周期,包括持久化、瞬时、托管和游离状态。手册会阐述这些状态的意义,以及在不同状态下对象的行为。 10. **实用工具与扩展**:除了基本功能,Hibernate还提供了许多...
总之,《深入浅出Hibernate》读书笔记涵盖了实体对象生命周期的转换、实体对象的识别机制以及Hibernate的多级缓存策略,这些都是理解并有效使用Hibernate的关键点。通过深入学习这些概念,开发者能够更好地掌握...
9. **实体生命周期**:Hibernate管理对象的生命周期,包括瞬时态、持久态、托管态和游离态。理解这些状态转换有助于避免编程陷阱。 10. **一对多、多对一、一对一和多对多关系映射**:Hibernate支持多种关联映射,...
7. **实体生命周期**:了解Hibernate如何处理对象的创建、更新、删除等状态变化。 8. **性能调优**:包括批处理、连接池配置、查询优化等方面的知识。 9. **拦截器和事件监听器**:学习如何自定义行为,比如在对象...
10. **Callback事件**:Hibernate提供了一些生命周期回调方法,如preInsert、postLoad等,可以在对象的生命周期中插入自定义代码。 11. ** Criteria API**:这是一种更面向对象的查询方式,相比HQL,它更具有灵活性...
Hibernate 管理实体的生命周期,从瞬态到持久化,再到托管和游离,开发者可以通过 Session 的各种方法控制这些状态的转换。 **一对一、一对多、多对一、多对多关系映射** Hibernate 支持多种关联映射,包括一对一...
- 第一级缓存:每个Session内部的一个缓存,自动管理实体对象的生命周期。 - 第二级缓存:SessionFactory级别的缓存,可配置第三方缓存插件如EhCache,提高性能。 - 查询缓存:存储查询结果,减少重复查询。 8. ...