我对 JPA 中的实体状态有疑问。
我读过一些关于jpa中实体状态的文章,我对它们的理解是:
和
现在我的问题是;这两种状态(
transient
和removed
)与持久上下文没有任何关联,并且它们不代表数据库中的任何记录(它们在数据库中没有任何记录)。所以它们都是一样的。那么这两者有什么区别呢?
编辑:
我们可以说最后
transient
对象没有id,但removed
对象有id吗?
从技术上讲,它们并不相同,尽管它们有时看起来具有相同的行为,但它们用于表示对象的特定生命周期阶段。
当使用关键字Transient
创建对象时,应在对象的初始状态期间考虑
new
,然后这些对象仅被视为存在于内存中,并且一旦它们的所有引用被回收,就会被垃圾收集走了。但由于 Transient
状态是对象生命周期的开始,因此稍后可能会将其置于托管状态并最终永久存储在数据库中。
Removed
状态是对象的最后可能状态,通常是在提交期间手动暂存该对象以从底层数据库进行物理删除时,即对于已存储在数据库中的对象来说,此状态通常是可访问的,但不再需要了。
所以,是的,当您在
isolation
中查看它们时,一旦它们的效果发生,接近这两个生命周期事件的结束时,它们可能看起来相同,即 transient
状态的结束在删除最后一个引用后,对象可能尚未移至托管状态,因此没有留下任何内容,因此没有记录。
removed
状态的结束,其中对象已从其曾经存在的数据库中物理删除,没有留下任何内容,因此不再有记录。