为什么我需要在JPA中以两种方式设置实体

时间:2016-05-30 21:58:33

标签: jpa ejb eclipselink

我有两个以下实体:

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

@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();用于同一个飞行实体对象时,它仅在我完成上述双向链接时显示。有人可以对此有所了解吗?我非常感激。提前谢谢。

2 个答案:

答案 0 :(得分:2)

你的问题似乎是为了问为什么你必须保持双向关系的双方,这是一个常见的问题和混乱的根源。

CMP 2.0尝试在幕后执行关系维护和魔术,但是开销和缺乏控制是一个问题(IMO),它没有包含在JPA中。相反,JPA实体应该是普通的旧Java对象。这意味着如果您希望对关系的一方所做的更改反映在另一方,则必须自己制作。

令人困惑的是,如果您修改关系的一方而不修改另一方,有时数据库将正确更新,有时不会,有时双方都会显示更改。这一切都取决于您更改哪一方,以及如何从数据库缓存和刷新实体。对拥有方的更改将持久保存到数据库,JPA允许进行高速缓存,因此非拥有方可能不会反映这些更改,直到从数据库刷新为止。

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

答案 1 :(得分:0)

因为在JPA中你有一个单向的概念&#34;关系。如果你没有指定&#34;映射&#34;属性,你要创建2个单向关系(1:N和N:1)而不是双向1:N关系。

然后人们可能会问&#34;为什么人们需要两个单向关系&#34;?答案是因为JPA的构建是为了满足奇怪的遗留数据库。 : - )