为什么我需要在JPA中双向设置实体

为什么我需要在JPA中双向设置实体,jpa,ejb,eclipselink,Jpa,Ejb,Eclipselink,我有以下两个实体: @Entity public class Pilot implements Serializable { .... @ManyToOne @JoinColumn(name = "FLIGHT_ID") private Flight flight; } 及 @实体 公共类航班实现可序列化{ .... @OneToMany(mappedBy=“航班”) 私人名单飞行员; } 我正在使用EJB向航班添加飞行员: public void addPilotT

我有以下两个实体:

@Entity
public class Pilot implements Serializable {
....
    @ManyToOne
    @JoinColumn(name = "FLIGHT_ID")
    private Flight flight;
}

@实体
公共类航班实现可序列化{
....
@OneToMany(mappedBy=“航班”)
私人名单飞行员;
}
我正在使用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?
}
public void addPilotToFlight(String pilottid,String flightId){
<查找航班f的代码>

p、 setFlight(f);
f、 getPilots().add(p);//为什么我需要这个?
}
我的困惑是为什么我需要双向链接对象


我已经试过有和没有
f.getPilots().add(p)的代码部分,在DB中看起来完全一样。但是,当我尝试使用
f.getPilots()时
对于同一飞行实体对象,仅当我完成了上述双向链接时才会显示。有人能解释一下吗?我将非常感激。提前感谢。

因为在JPA中,你有“单向”关系的概念。如果不指定“mapped by”属性,则将创建两个单向关系(1:N和N:1),而不是双向1:N关系


然后有人可能会问:“为什么人们需要两种单向关系?”?答案是因为JPA是为了满足甚至奇怪的遗留数据库而构建的。:-)

你的问题似乎旨在问为什么你必须保持双向关系的双方,这是一个常见的问题,也是困惑的根源

CMP2.0试图在幕后执行关系维护和魔术,但开销和缺乏控制是一个问题(IMO),并且未包含在
JPA
中。相反,JPA实体应该是普通的旧java对象。这意味着,如果你想让对关系的一方所做的改变反映在另一方,你必须自己去做

令人困惑的是,如果修改关系的一方而不是另一方,有时数据库会正确更新,有时不会,有时双方都会显示更改。这完全取决于您更改的哪一侧,以及如何从数据库缓存和刷新实体。对拥有方的更改被持久化到数据库中,JPA允许缓存,因此非拥有方在从数据库刷新之前可能不会反映这些更改


最佳实践是,如果希望对象模型与数据库保持同步,则应用程序应对其中一方进行任何更改

我需要知道您如何在实体类中定义Flight的PK,以及您如何访问代码中的实体(您如何创建实体管理器等),以便回答您的问题如果在整个应用程序中处理,则可以提高性能和可伸缩性,但会产生成本和收益。我不会因为这个问题而关闭它,因为您可以轻松地在实体的访问器方法中设置另一端。
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?
}