Hibernate 我应该避免使用mappedBy来保持应用程序的稳定性吗?

Hibernate 我应该避免使用mappedBy来保持应用程序的稳定性吗?,hibernate,jpa,jboss,Hibernate,Jpa,Jboss,我有两个实体,如下所示: @Entity public class Trip { @OneToMany(mappedBy = "trip", fetch = FetchType.LAZY) private Set<Job> jobs = new HashSet<Job>(); } @Entity public class Job { @ManyToOne(fetch = FetchType.LAZY) private Trip tr

我有两个实体,如下所示:

@Entity
public class Trip {

    @OneToMany(mappedBy = "trip", fetch = FetchType.LAZY)
    private Set<Job> jobs = new HashSet<Job>();

}

@Entity
public class Job {

    @ManyToOne(fetch = FetchType.LAZY)
    private Trip trip;

}
上面的代码显示,如果实体已加载到实体管理器的缓存中,则mappedBy关系的getter可能返回无效结果

我有证据证明它在JBoss下也不起作用。以下代码的行为因使用的实体管理器而异。结果是不可预测的

        Trip trip = em.find(Trip.class, tripId);
        if (trip.getJobs().size() == 0) ...
这是否意味着mappedBy一经引入和使用就会自动导致应用程序出现错误


另外,我不是想滥用冬眠。我只想知道是否有人遇到了这样的问题,以及他们是如何使用
mappedBy
(即双向关联)来解决的。然而,配置起来很棘手,你必须非常小心如何使用它——它不是一个灵丹妙药,如果你不遵循编程指南,你可能会让你的实体处于不一致的状态


出于这个原因,我倾向于避开它们;我只在我真的需要双向联想时才使用它们,以我的经验,这是非常罕见的。

你所描述的行为与联想毫无关系;如果您只是尝试从两个实体管理器读取/更新简单的POJO,您将得到完全相同的结果。一旦实体与持久性上下文关联,它将不会从数据库中自动刷新。这是一个记录在案的行为——在绝大多数情况下,这是一个期望的行为

就“保持应用程序稳定”而言:

  • EntityManager实例直接对应于Hibernate会话,因此不应长时间保持。如果您重写上面的代码以使用新的EntityManager实例(em3)而不是重用em1,您的问题就会消失
  • EntityManager有一个
    refresh()
    方法,您可以调用该方法从数据库重新加载实体状态
  • EntityManager有一个
    clear()
    方法,该方法将完全清除持久性上下文,从而防止出现此问题。不过,请谨慎使用,不使用flush()调用
    clear()
    将丢弃所有挂起的更新

  • 请编辑您的问题并尽量保持客观。没有人喜欢读咆哮。没错,简单的属性也不会更新!谢谢你指出这一点。回答得很好,还有一个令人耳目一新的改变,看看反对双向的建议。Hibernate引用使用了太多的断言参数。
            Trip trip = em.find(Trip.class, tripId);
            if (trip.getJobs().size() == 0) ...