在用Hibernate的时候,时不时会因为没有处理好实体对象的状态而犯一些莫名其妙的异常,在这里对实体对象的各种状态整理一下,希望能有所帮助。
Hibernate实体对象,即指Hibernate O/R影射关系中的域对象 即O/R中的"O"。在Hibrenate实体对象的生命周期中存在着三中状态,即:
1:自由状态(Transient)。
2:持久状态(Persistent)。
3:游离状态(Detached)。
1:自由状态(Transient)
自由状态(Transient),是指实体对象在内存中自由存在,他与数据库的记录无关。如:
TUser user = new TUser();
user.setName("MyName");
这里的user对象只是一个非常普通的java对象,与数据库中的记录没有任何关系。
2:持久状态(Persistent)
持久状态(Persistent),即实体对象处于Hibernate框架的管理状态,实体对象被纳入Hibernate的实体容器中管理。处于
持久状态的对象,其更变将由Hibernate固化到数据库中。如:
//创建两个处于自由状态的实体对象。
TUser user_1 = new TUser();
TUser user_2 = new TUser();
user_1.setName("Name_1");
user_2.setName("Name_2");
Transaction tx = session.begintransaction();
session.save(user_1);
//通过session的save方法,user_1对象已经被纳入Hibernate的实体管理容器,处于持久化状
//态(Persistent),这时候对user_1对象的任何修改都将被同步到数据库中。
tx.commit();
//而user_2仍然才处于自由状态(Transient),不受Hibernate框架的管理。
从上面看到,处于
自由状态的实体对象,可以通过Hibernate的Session.sava方法转化为
持久状态。
除了用Session.save方法外,还可以通过其他方法来获取一个
持久状态的对象,那就是直接通过Hibernate加载的对象,通过Session.load方法,可以直接加载一个处于
持久状态的实体对象。如下:
TUser user = Session.load(TUser.class,new Integer(1));
//在load方法没返回之前,就已经先把对象纳入Hibernate的管理范围,所以这里的user
//已经处于持久状态。
从上面的代码可以看出,处于
持久状态的实体对象一定要和Session关联,并处于该Session的有效期内。
3:游离状态(Detached)
处于
持久状态的实体对象,在其关联的Session关闭以后,此实体对象就处于
游离状态,
TUser user = new TUser();
user.setName("name_1");
Transaction tx = session.begintransaction();
session.save(user);//把自由状态的实体对象user转为持久状态,
tx.commit();
session.close();
//session关闭以后,处于持久状态的实体对象user将转为游离状态。
//因为此时user已经和session脱离关系。
由上面可以看到实体对象的
游离状态是在对象和它所寄宿的Session脱离关系后形成的,但处于
自由状态的实体对象也没有和任何session有关联,那么他们两者有什么区别呢?关键的就在我们对
自由状态的实体对象执行了Session.save方法,
当我们执行
TUser user = new TUser();
时,我们只是创建了一个普通的对象,他并没有和数据库里的任何一条记录对应,当我们执行
Session.save以后,Hibernate就为user设置了一个主键,就是user.Id属性,通过这个属性,Hibernate就把user对象和数据库里的记录关联起来,所以
自由状态和
游离状态的基本区别就是 处于
游离状态的实体对象,在数据库里有对应的记录,因此它可以通过和session关联再次转为
持久状态。
三种状态的转化
自由状态-->持久状态:可以通过Session.sava方法来转换。
持久状态-->游离状态:可以通过Session.close方法来关闭session,获取游离状态的对象
持久状态-->自由状态:可以通过Session.delete方法来删除实体对象对应的数据库记录,使实体对象处于自由状态。
补充一下,有时可能会想,可以通过认为的个处于
自由状态的实体对象设置一个Id值
user.Id=1
,来人为的创建一个
游离状态的对象。
这里注意一点,我们可以人为地给实体对象设置Id值,我我们无法知道这个ID值在数据库里有没有对应的记录,如果没有,就算我们人为地设置了Id,也不能说一个有ID的实体对象就是一个
游离状态的对象。
分享到:
相关推荐
在IT行业中,尤其是在Java开发领域,实体对象的生命周期管理是至关重要的一个环节,尤其是在使用ORM(Object-Relational Mapping)框架如Hibernate时。本文将详细探讨“测试实体对象的生命周期”,并结合给定的标签...
**hibernate的生命周期** Hibernate 是一款强大的Java对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据库事务。在Hibernate中,每个持久化对象都有一个生命周期,...
Session对象负责管理实体对象的状态,包括保存、更新、删除和检索数据。它的生命周期主要包括以下几个阶段: 1. **创建Session**: 当我们调用`SessionFactory.openSession()`方法时,一个新的Session实例就会被...
`HibernateSessionFactory`通常在应用启动时初始化一次,然后在整个应用生命周期中复用,以提高性能。创建`SessionFactory`通常涉及配置Hibernate的XML文件,其中包含了数据库连接信息、实体映射等设置。 `...
总结,理解Hibernate3.2中的对象生命周期是有效使用Hibernate的关键。正确管理对象状态,能够避免数据丢失,提高应用程序性能,并减少潜在的并发问题。深入源码和使用专业工具能进一步提升开发效率。
理解并掌握这些状态,可以帮助我们更好地控制对象的生命周期,避免数据不一致。 在实体层设计中,还要考虑性能优化。例如,通过懒加载(Lazy Loading)策略,我们可以延迟加载关联的对象,以减少数据库查询次数。...
9. **生命周期方法**:在某些编程语言和框架中,领域对象可能包含一些生命周期方法,如 `save()`、`delete()`、`load()` 等,用于操作对象的生命周期。 10. **CQRS(命令查询责任分离)**:在复杂系统中,CQRS 模式...
23.1.1 Session对象的生命周期与本地线程绑定 23.1.2 Session对象的生命周期与JTA事务绑定 23.2 实现对话 23.2.1 使用游离对象 23.2.2 使用手工清理缓存模式下的Session 23.3 小结 23.4 思考题 第24章...
在Hibernate中,通过`@ManyToOne`或`@OneToOne`注解表示,但需要注意的是,聚合关系通常不会影响对象的生命周期。 这些关系模型在Hibernate中通过注解或者XML配置文件进行定义,以实现Java对象和数据库记录之间的...
Hibernate实体对象生命周期的三种状态 - **瞬态(Transient)**:未被持久化的实体对象。 - **持久态(Persistent)**:已与Session关联,且Session处于打开状态的实体对象。 - **游离态(Detached)**:与Session...
Hibernate允许开发者定义对象的生命周期回调方法,如preInsert()、postInsert()、preUpdate()等,以便在对象状态改变时执行特定的业务逻辑。 **九、懒加载与立即加载** 懒加载(Lazy Loading)是一种优化策略,只在...
2. **持久化状态(Persistent)**:当实体对象被加入到Session的管理范围,即在Session的生命周期内,就进入了持久化状态。这意味着对象与数据库中的记录建立了绑定,任何对实体对象的修改都会在Session flush时同步到...
总之,《深入浅出Hibernate》读书笔记涵盖了实体对象生命周期的转换、实体对象的识别机制以及Hibernate的多级缓存策略,这些都是理解并有效使用Hibernate的关键点。通过深入学习这些概念,开发者能够更好地掌握...
6. **实体生命周期管理**:Hibernate自动管理对象的状态,包括瞬态、持久化、托管和脱管四种状态,以及它们之间的转换。 7. **多对一、一对多、多对多关系映射**:Hibernate支持复杂的关联关系映射,如单向关联、...
本章站在持久化层的角度,Java对象在生命周期中可处于临时状态、持久化状态、删除状态和游离状态。处于持久化状态的Java对象位于一个Session实例的缓存中,Session能根据这个对象的属性变化来同步更新数据库。 8.1 ...
在Hibernate中,对象的生命周期包括瞬时态、托管态、持久态和脱管态。通过Hibernate,我们可以轻松地将对象从内存中保存到数据库,或者从数据库中加载到内存。 **三、Hibernate配置** 使用Hibernate,首先需要配置...
一旦对象变为持久态,Hibernate会负责它的生命周期管理,包括插入、更新和删除操作。 二、一对一(OneToOne)关系映射 在数据库设计中,一对一关系意味着两个实体表之间存在唯一映射。在Hibernate中,可以通过@...
本章站在持久化层的角度,Java对象在生命周期中可处于临时状态、持久化状态、删除状态和游离状态。处于持久化状态的Java对象位于一个Session实例的缓存中,Session能根据这个对象的属性变化来同步更新数据库。 8.1 ...