Eclipselink:重新连接到数据库

时间:2017-05-16 17:17:01

标签: eclipselink jpa-2.0

我必须与他们之间有一对多关系的实体。当我持久化实体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

2 个答案:

答案 0 :(得分:1)

答案基于给定的伪代码。

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

  

通常,便携式应用程序的生命周期方法   不应该调用EntityManager或Query操作,访问其他   实体实例,或修改同一持久性内的关系   上下文。生命周期回调方法可以修改   调用它的实体的非关系状态。

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

答案 1 :(得分:0)

这是我的一个问题。如果连接列标记为insertable = false,则updatable = false。回调方法仍然不是我希望的答案。

对于那些在这里得到这个问题的人来说,到目前为止我学到了什么:

  • 回拨方法(@PrePersist,@ PreUpdate等)不允许修改原始对象。任何更改都需要在保留之前通过其他方式完成。