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,您将得到完全相同的结果。一旦实体与持久性上下文关联,它将不会从数据库中自动刷新。这是一个记录在案的行为——在绝大多数情况下,这是一个期望的行为 就“保持应用程序稳定”而言:
refresh()
方法,您可以调用该方法从数据库重新加载实体状态clear()
方法,该方法将完全清除持久性上下文,从而防止出现此问题。不过,请谨慎使用,不使用flush()调用clear()
将丢弃所有挂起的更新请编辑您的问题并尽量保持客观。没有人喜欢读咆哮。没错,简单的属性也不会更新!谢谢你指出这一点。回答得很好,还有一个令人耳目一新的改变,看看反对双向的建议。Hibernate引用使用了太多的断言参数。
Trip trip = em.find(Trip.class, tripId);
if (trip.getJobs().size() == 0) ...