Eclipselink:重新连接数据库后,对实体 PrePersist/PreUpdate 的修改会丢失

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

我有两个实体,它们之间具有一对多关系。当我坚持

EntityA
时,我使用
PrePersist
PreUpdate
来更改值并在
EntityB
上创建实体,并将它们与
EntityA
相关联。

EntityManager
打开时一切正常。如果我关闭它并重新打开它,
EntityA
“忘记”
EntityB
EntityB
条目仍然存在,但它们之间的链接丢失了。

这是伪代码:

@PrePersist
@PreUpdate
void onCreate(EntityA a){
  EntityB b = new EntityB();
  persist b;
  a.getBList().add(b);
}

创建后检查

a.getBList()
大小为1。

当我关闭

EntityManager
并再次打开它时,
a.getBList()
大小为0,但
EnitiyB
仍然存在。就像
BList
永远不会持久化到实际数据库中一样。

有什么想法吗?

注意: 这是一个过于简单化的示例。您可以在here找到实际代码。

eclipselink jpa-2.0
2个回答
1
投票

答案基于给定的伪代码。

一个可能的原因是实现不支持这种方法。规范不要求支持修改生命周期回调方法中的关系(JPA 2 规范,3.5):

一般来说,便携式应用程序的生命周期方法 不应调用 EntityManager 或查询操作、访问其他 实体实例,或修改同一持久性内的关系 语境。 [43] 生命周期回调方法可以修改 调用它的实体的非关系状态。

如果

blist
是双向关系的非拥有方,这个问题也可能会出现。如果是这种情况,那么 EntityB 中的拥有方也应该设置。


0
投票

这是我这边的问题。将连接列标记为 insertable = false、updatable = false。回调方法仍然不是我所希望的答案。

对于其他遇到这个问题的人,这是我到目前为止所学到的:

  • 回调方法(@PrePersist、@PreUpdate等)不允许修改原始对象。任何更改都需要在持久之前通过其他方式完成。
© www.soinside.com 2019 - 2024. All rights reserved.