对于hibernate,它的对象有三种状态,transient、persistent、detached
1.transient:瞬态或者自由态
(new DeptPo(1,”行政部”,20,”行政相关”),该po的实例和session没有关联,该po的实例处于transient)
2.persistent:持久化状态
(和数据库中记录想影射的Po实例,它的状态是persistent, 通过get和load等得到的对象都是persistent)
3.detached:脱管状态或者游离态
(1)当通过get或load方法得到的po对象它们都处于persistent,但如果执行delete(po)时(但不能执行事务),该po状态就处于detached, (表示和session脱离关联),因delete而变成游离态可以通过save或saveOrUpdate()变成持久态
(2)当把session关闭时,session缓存中的persistent的po对象也变成detached
因关闭session而变成游离态的可以通过lock、save、update变成持久态
持久态实例可以通过调用 delete()变成脱管状态。
通过get()或load()方法得到的实例都是持久化状态的。
脱管状态的实例可以通过调用lock()或者replicate()进行持久化。
save()和persist()将会引发SQL的INSERT,delete()会引发SQLDELETE,
而update()或merge()会引发SQL UPDATE。对持久化(persistent)实例的修改在刷新提交的时候会被检测到,它也会引起SQL UPDATE。
saveOrUpdate()或者replicate()会引发SQLINSERT或者UPDATE
二、save 和update区别
把这一对放在第一位的原因是因为这一对是最常用的。
save的作用是把一个新的对象保存
update是把一个脱管状态的对象或自由态对象(一定要和一个记录对应)更新到数据库
三、update 和saveOrUpdate区别
这个是比较好理解的,顾名思义,saveOrUpdate基本上就是合成了save和update,而update只是update;引用hibernate reference中的一段话来解释他们的使用场合和区别
通常下面的场景会使用update()或saveOrUpdate():
程序在第一个session中加载对象,接着把session关闭
该对象被传递到表现层
对象发生了一些改动
该对象被返回到业务逻辑层最终到持久层
程序创建第二session调用第二个session的update()方法持久这些改动
saveOrUpdate(po)做下面的事:
如果该po对象已经在本session中持久化了,在本session中执行saveOrUpdate不做任何事
如果savaOrUpdate(新po)与另一个与本session关联的po对象拥有相同的持久化标识(identifier),抛出一个异常
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [org.itfuture.www.po.Xtyhb#5]
saveOrUpdate如果对象没有持久化标识(identifier)属性,对其调用save() ,否则update() 这个对象
四、persist和save区别
这个是最迷离的一对,表面上看起来使用哪个都行,在hibernate reference文档中也没有明确的区分他们.
这里给出一个明确的区分。(可以跟进src看一下,虽然实现步骤类似,但是还是有细微的差别)
主要内容区别:
1,persist把一个瞬态的实例持久化,但是并"不保证"标识符(identifier主键对应的属性)被立刻填入到持久化实例中,标识符的填入可能被推迟到flush的时候。
2,save, 把一个瞬态的实例持久化标识符,及时的产生,它要返回标识符,所以它会立即执行Sql insert
五、saveOrUpdate,merge和update区别
比较update和merge
update的作用上边说了,这里说一下merge的
如果session中存在相同持久化标识(identifier)的实例,用用户给出的对象覆盖session已有的持久实例
(1)当我们使用update的时候,执行完成后,会抛出异常
(2)但当我们使用merge的时候,把处理自由态的po对象A的属性copy到session当中处于持久态的po的属性中,执行完成后原来是持久状态还是持久态,而我们提供的A还是自由态
六、flush和update区别
这两个的区别好理解
update操作的是在自由态或脱管状态(因session的关闭而处于脱管状态)的对象//updateSQL
而flush是操作的在持久状态的对象。
默认情况下,一个持久状态的对象的改动(包含set容器)是不需要update的,只要你更改了对象的值,等待hibernate flush就自动更新或保存到数据库了。hibernate flush发生在以下几种情况中:
1, 调用某些查询的和手动flush(),session的关闭、SessionFactory关闭结合
get()一个对象,把对象的属性进行改变,把资源关闭。
2,transaction commit的时候(包含了flush)
七、lock和update区别
update是把一个已经更改过的脱管状态的对象变成持久状态
lock是把一个没有更改过的脱管状态的对象变成持久状态(针对的是因Session的关闭而处于脱管状态的po对象(2),不能针对因delete而处于脱管状态的po对象)
对应更改一个记录的内容,两个的操作不同:
update的操作步骤是:
(1)属性改动后的脱管的对象的修改->调用update
lock的操作步骤是:
(2)调用lock把未修改的对象从脱管状态变成持久状态-->更改持久状态的对象的内容-->等待flush或者手动flush
八、clear和evcit的区别
clear完整的清除session缓存
evcit(obj)把某个持久化对象从session的缓存中清空。
分享到:
相关推荐
### Java的几种对象详解:PO-VO-DAO-BO-POJO #### 一、PO:Persistant Object(持久对象) 持久对象(Persistent Object,简称PO),主要用于与数据库中的表进行映射。一个简单的PO对象可以代表数据库表中的一条...
《POJO In Action》是一本深入探讨Plain Old Java Object(POJO)概念和技术的书籍,其核心在于如何在Java开发中有效地使用简单、无框架依赖的对象。POJOs是Java编程中最基本的元素,它们代表了纯粹的面向对象设计,...
值对象(VO)是一种无状态的对象,它代表了一组值的集合。在Java应用程序中,VO通常用于封装数据,并在不同的层次间传递数据。VO并不持久化到数据库,也不包含任何业务逻辑,其主要目的是简化数据传输过程,提高代码...
POJO是Java编程中的一种术语,用来描述一个普通的、没有特殊框架或库约束的Java对象。它不遵循任何特定的规范,如EJB(Enterprise JavaBeans)或其他持久化框架。POJOs通常用于构建业务逻辑层,它们简单、灵活且...
POJO Cache 提供了一种面向对象且分布式的缓存机制,使得用户在处理对象时无需直接关心缓存管理和对象关系的维护。 ### 1. 缓存的基本概念 - **内存高速缓存**: 内存高速缓存用于存储程序状态信息,比如...
POJO代表的是“Plain Old Java Objects”,这是一种没有特殊接口或父类的简单Java对象。这些对象可以作为应用程序的核心业务逻辑载体。POJOs的主要优势在于其灵活性和可测试性。由于它们不依赖于特定的API或框架,...
定义一个ViewModel,将POJO对象暴露给布局,然后在XML布局中引用这些属性。 6. **Android Studio兼容性**: 虽然提到了Eclipse工程,但现代的Android开发通常使用Android Studio。如果需要迁移到Android Studio,...
POJO是没有任何特定框架约束的普通Java对象,它们代表了数据库中的实体。JPA允许我们将这些POJO与数据库表进行映射,这样我们就可以通过这些对象来操作数据库,比如添加、更新、删除记录。 在提供的链接中,博主...
持久化对象根据与Session的关系可以分为三种状态:瞬态、持久化和托管。 - **瞬态(Transient)**:对象刚被创建出来,还没有与任何Session建立关联,此时的对象不在Session的管理之下。 - **持久化(Persistent...
总结来说,这五种对象各有其应用场景和目的: - POJO是基本的Java对象,没有特定框架约束,适用于各种场景。 - PO是与数据库表对应的对象,主要用于持久化操作。 - VO关注于前端展示,确保模型与视图的分离。 - DO...
总结起来,`serializepojo`是一个专为Java开发人员设计的实用库,简化了将简单POJO对象序列化为CSV格式的过程,从而增强了数据的可移植性和可读性。在处理大量结构化数据时,这种工具能大大提高开发效率和数据处理的...
- **定义**:POJO 是一种普通的Java对象,它可以是DTO、VO、BO、DO 或者其他任何对象。 - **应用场景**: - 构建灵活的应用程序组件。 - 作为数据传输的容器。 - **优势**: - 无特定框架依赖。 - 易于理解和...
MappedStatement是Executor处理SQL信息的载体,它包含了SQL语句、输入参数的映射信息(如HashMap或POJO对象)、以及输出结果的映射信息。MyBatis使用这些信息将Java对象和数据库中的数据进行双向映射,实现了ORM...
《Pojo-State:开源Java对象状态观察库的深度解析》 在Java开发中,我们常常需要处理对象的状态变化,这涉及到数据的同步、更新以及事件的监听等复杂问题。为了解决这一问题,一个名为“Pojo-State”的开源库...
这在需要同步两个对象状态或回滚更改时特别有用。 4. **Java版本兼容性**:DiffEngine设计时考虑了向后兼容性,支持Java 1.7及更高版本。这意味着即使在较旧的项目中,也能方便地集成和使用。 5. **测试用例**:在...
在Hibernate中,实体对象有三种状态: 1. **Transient(自由状态)**: 对象在内存中独立存在,与数据库记录无关,仅是普通的Java对象。 2. **Persistent(持久状态)**: 对象被Hibernate管理,与数据库中的记录关联...
Java的序列化机制允许对象的状态被保存到磁盘或在网络上传输。在MyBatis Generator中,我们可以通过在`<javaModelGenerator>`标签中添加`useActualColumnNames="true"`属性,使生成的实体类字段名与数据库列名保持...
Hibernate管理的实体对象有三种状态: 1. Transient(自由状态):对象未与任何Session关联,与数据库无直接联系。 2. Persistent(持久状态):对象已保存在数据库中,与当前Session关联,其变化会被持久化到数据库...