我有以下两个实体:
@Entity
public class Pilot implements Serializable {
....
@ManyToOne
@JoinColumn(name = "FLIGHT_ID")
private Flight flight;
}
and
@Entity
public class Flight implements Serializable {
....
@OneToMany(mappedBy = "flight")
private List<Pilot> pilots;
}
我正在使用 EJB 将飞行员添加到航班中:
public void addPilotToFlight(String pilotId, String flightId) {
<code to find Flight f>
<code to find Pilot p>
p.setFlight(f);
f.getPilots().add(p); // Why do I need this one?
}
我的困惑是为什么我需要双向链接对象?
我已经尝试过有和没有的代码f.getPilots().add(p);
部分,在 DB 中看起来完全相同。但是,当我尝试使用f.getPilots();
对于同一个航班实体对象,它仅在我完成上述双向链接后才显示。有人可以解释一下吗?我将非常感激。提前致谢。
您的问题似乎旨在询问为什么必须维持双向关系的双方,这是一个常见的问题和混乱的根源。
CMP 2.0 试图在幕后执行关系维护和魔法,但开销和缺乏控制是一个问题(IMO),并且它没有包含在JPA
。相反,JPA 实体是普通的旧 java 对象。这意味着,如果您希望对关系的一侧所做的更改反映在另一侧,您必须自己做出改变。
令人困惑的是,如果您修改关系的一侧而不是另一侧,有时数据库会正确更新,有时不会,有时双方都会显示更改。这完全取决于您更改哪一侧,以及如何从数据库缓存和刷新实体。对拥有方的更改会持久保存到数据库中,并且 JPA 允许缓存,因此非拥有方可能无法反映这些更改,直到从数据库刷新为止。
最佳实践是,如果您希望对象模型与数据库保持同步,则应用程序应该对一侧所做的任何更改也对另一侧进行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)