我必须与他们之间有一对多关系的实体。当我持久化实体A时,我使用PrePersist和PreUpdate来更改值并在实体B上创建实体并将它们与A相关联。
实体管理器打开时,一切正常。如果我关闭它并重新打开它,实体A"忘记"关于实体B.实体B条目仍然存在,但它们之间的链接丢失。
这里是伪代码:
@PrePersist
@PreUpdate
void onCreate(EntityA a){
EntityB b = new EntityB();
persist b;
a.getBList().add(b);
}
选中后,a.getBList()大小在创建后为1。
当我关闭实体管理器并再次打开它时,a.getBList()大小为0,但EnitiyB仍在那里。就像BList永远不会持久化到实际的数据库。
有什么想法吗?
注意:这是一个过于简单的示例。您可以找到实际代码here。
答案 0 :(得分:1)
答案基于给定的伪代码。
一个可能的原因是实施不支持这种方法。规范不要求支持修改生命周期回调方法中的关系(JPA 2规范,3.5):
通常,便携式应用程序的生命周期方法 不应该调用EntityManager或Query操作,访问其他 实体实例,或修改同一持久性内的关系 上下文。生命周期回调方法可以修改 调用它的实体的非关系状态。
如果blist
是双向关系的非拥有方,则此问题可能会增加。如果是这种情况,那么也应该设置EntityB中的拥有方。
答案 1 :(得分:0)
这是我的一个问题。如果连接列标记为insertable = false,则updatable = false。回调方法仍然不是我希望的答案。
对于那些在这里得到这个问题的人来说,到目前为止我学到了什么: