JPA中的瞬态和移除状态有什么区别?

问题描述 投票:0回答:1

我对 JPA 中的实体状态有疑问。

我读过一些关于jpa中实体状态的文章,我对它们的理解是:

  • 瞬态对象是新创建的对象,尚未与持久化上下文关联,不代表数据库中的记录。

  • 当我们删除一个对象时,它不再与持久上下文有任何关联,并且它在数据库中的记录将被删除。

现在我的问题是;这两种状态(

transient
removed
)与持久上下文没有任何关联,并且它们不代表数据库中的任何记录(它们在数据库中没有任何记录)。所以它们都是一样的。那么这两者有什么区别呢?


编辑:

我们可以说最后

transient
对象没有id,但
removed
对象有id吗?

java database hibernate jpa orm
1个回答
3
投票

从技术上讲,它们并不相同,尽管它们有时看起来具有相同的行为,但它们用于表示对象的特定生命周期阶段。

当使用关键字

Transient

 创建对象时,应在对象的初始状态期间考虑 
new
,然后这些对象仅被视为存在于内存中,并且一旦它们的所有引用被回收,就会被垃圾收集走了。但由于
Transient
状态是对象生命周期的开始,因此稍后可能会将其置于托管状态并最终永久存储在数据库中。

Removed
状态是对象的最后可能状态,通常是在提交期间手动暂存该对象以从底层数据库进行物理删除时,即对于已存储在数据库中的对象来说,此状态通常是可访问的,但不再需要了。

所以,是的,当您在

isolation
中查看它们时,一旦它们的效果发生,接近这两个生命周期事件的结束时,它们可能看起来相同,即
transient
状态的结束在删除最后一个引用后,对象可能尚未移至托管状态,因此没有留下任何内容,因此没有记录。
removed
状态的结束,其中对象已从其曾经存在的数据库中物理删除,没有留下任何内容,因此不再有记录。

© www.soinside.com 2019 - 2024. All rights reserved.