JPA对象的四种状态
前言
博主在搜索Jpa对象四种状态的资料时发现,网上的某些资料存在误导(博主就被误导了,超无语),对于四种状态的概念有失偏颇。今天特地将四种状态学习总结一下,以便网友们深刻了解,有助于解决工作中遇到的问题。
实体对象的状态介绍
- 瞬时状态:当对象刚被创建时,也就是使用new创建的实体对象,被称为瞬时状态。
- 持久状态:当对象和
EntityManager
产生关系后进入持久化上下文,也就是调用persist()
、find()
和merge()
方法后,被EntityManager
管理,对象状态为持久状态。 - 游离状态:当事务被提交时,该实体对象状态为游离状态,游离状态中的对象可以看作脱离了
EntityManager
管理。 - 删除状态:当
EntityManger
调用remove()
时,对象处于删除状态
下面我们来看一张图:
图中em
指的就是EntityManager
,我们一起分析一下状态之间的转换。
首先,New就是新创建的对象,此时的状态还是瞬时状态。
当
em
调用persist()
方法后这个对象被em
管理了,进入持久化上下文,对象状态切换为持久状态,这里的持久化不是说已经写入数据库了,因为还有事务呢。持久状态的数据只有在commit
的时候才会写入数据库。
这里有一个点需要特别注意,在persist()
或merge()
后,事务commit之前,如对象内容进行了修改,数据库中的最终结果就是你修改后的结果.
提交事务的后,数据写入数据库,对象的状态也发生了变化,变为游离状态。对象此时脱离了
em
的管理,已经不在持久化上下文了,也就是说,此时如果修改该对象的内容,数据库是不会变的。游离状态的对象特征是脱离em管理,另外对象有OID
,其实就是对象的主键,在调用merge()
方法后,对象又回到持久状态,还是那句话持久状态的数据只有在commit
的时候才会写入数据库。
find()
也就是查询,从数据库查询数据后对象状态直接进入持久状态,在em
调用remove()
后对象进入删除状态但java对象还在,只是状态变了,同样在事务提交后才会从数据库删除。