JPA,Eclipselink,多对多:依赖集合不更新

时间:2012-01-05 10:03:17

标签: spring jpa many-to-many eclipselink

我的模型中有一对多关系。有两个实体,紧急情况和工作人员(工作人员可以参加许多紧急情况,反之亦然)。负责该关系的代码部分如下所示:

@JoinTable(name = "CREWS_ON_EMERGENCIES", joinColumns = {
    @JoinColumn(name = "EMERGENCY_ID", referencedColumnName = "EMERGENCY_ID", nullable = false)}, inverseJoinColumns = {
    @JoinColumn(name = "CREW_ID", referencedColumnName = "CREW_ID", nullable = false)})
@ManyToMany(fetch= FetchType.EAGER)
private Collection<Crew> crewList;

@ManyToMany(mappedBy="crewList", fetch= FetchType.EAGER)
private Collection<Emergency> emergencyList;

Crew是一个依赖实体 - 当我添加新的紧急情况时,会更新 emergencyList ,其中包括参加过的船员名单。

实际上,数据库更新正常,并且在事务关闭后立即在CREWS_ON_EMERGENCIES表中显示新记录。但是,如果添加新的紧急情况然后显示他们参加的所有工作人员和紧急事件的列表,则不会显示最后的紧急情况(显然,“emergencyList”已过期)。它仅在我重新启动服务器(Tomcat)或处于调试模式时出现。

紧急保存()代码:

 @Transactional
public void save(Emergency e) {
    entityManager.persist(e);
    entityManager.flush();
}

Spring MVC将自动将选定的工作人员添加到集合crewList中。

有谁知道为什么它会以这样的方式发生,解决方案是什么?

1 个答案:

答案 0 :(得分:1)

我在这里看到两个潜在的问题:

  • 您的代码不维护双向关联的两面。如果机组人员加入紧急情况,紧急情况也应加入机组人员(反之亦然)。 JPA不会为您保持对象图的一致性。
  • 如果您需要重新启动Tomcat以查看更改,则意味着实体管理器永远不会关闭并重新打开,并且其实体缓存仍包含已在先前事务中加载的实体。使用实体管理器的方式肯定有问题。您使用的是Spring提供的事务和JPA支持吗?

旁注:当我看到EAGER用于多对多关联的两边时,我立即想到:“这个应用程序会慢得多”。紧急情况的负载将加载其所有的工作人员,这将加载所有紧急情况,这将加载所有他们的工作人员...递归。你可以像这样加载一半的数据库。