我有两个实体,它们之间具有一对多关系。当我坚持
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找到实际代码。
答案基于给定的伪代码。
一个可能的原因是实现不支持这种方法。规范不要求支持修改生命周期回调方法中的关系(JPA 2 规范,3.5):
一般来说,便携式应用程序的生命周期方法 不应调用 EntityManager 或查询操作、访问其他 实体实例,或修改同一持久性内的关系 语境。 [43] 生命周期回调方法可以修改 调用它的实体的非关系状态。
如果
blist
是双向关系的非拥有方,这个问题也可能会出现。如果是这种情况,那么 EntityB 中的拥有方也应该设置。
这是我这边的问题。将连接列标记为 insertable = false、updatable = false。回调方法仍然不是我所希望的答案。
对于其他遇到这个问题的人,这是我到目前为止所学到的: