为什么在 JPA 中需要分离的实体?
总是有很多问题与分离实体的问题有关!
首先,它们经常在冬眠中引起。是的,还有另一个持久性提供程序,它们不会引发异常,但我认为它们在一致性方面存在一些问题。考虑我们有和实体,有引用()从到那要求是非空的。LazyInitializationException
A
B
@ManyToOne
A
B
我们启动了会话,加载了实例,然后关闭了会话。之后,我们尝试获取对 的引用。并假设另一个事务刚刚删除了我们的和实例。因此,当我们从数据库查询时,我们无法找到合适的实例并得到!A
B
A
B
B
null
所以我们的合同被违反了。一些依赖于返回对象的事实的代码将抛出一个 .对于持久性实体,这是不可能的,因为我们在同一个事务中具有所有延迟加载并获取对象本身,因此所有操作都是原子的(当然,如果我们有适当的事务隔离)。a.getB()
NullPointerException
此外,当您想要将持久性和分离的实体存储在一个 中时,也存在问题。在这种情况下,您应该始终覆盖 和 ,这通常看起来很尴尬,因为我看不到一个非常好的方法来做到这一点。Set
equals
hashCode
要使分离的实体恢复,您应该使用这是故障。EntityManager
merge
所以我的问题是:是否存在真正需要分离实体的合理方案?此外,何时必须混合分离的实体和持久性实体,并将分离的实体合并到新的实体中?EntityManager