为什么我需要在 JPA 中双向设置实体
Why do I need to set the entities both ways in JPA
我有以下两个实体:
@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?
}
我的困惑是为什么我需要 link 双向对象?
我试过带和不带 f.getPilots().add(p);
部分的代码,在 DB 中它看起来完全一样。但是,当我尝试对同一个飞行实体对象使用 f.getPilots();
时,它仅在我完成上述双向 linking 时显示。任何人都可以对此有所了解吗?我将不胜感激。提前致谢。
因为在 JPA 中您有 "one-way" 关系的概念。如果您不指定 "mapped by" 属性,您将不会创建 2 个单向关系(1:N 和 N:1)而不是双向 1:N 关系.
那么有人会问"why the heck do people need two one-way relationships"?答案是因为 JPA 是为了满足甚至奇怪的遗留数据库而构建的。 :-)
你的问题似乎是想问为什么你必须保持双向关系的双方,这是一个常见的问题和混淆的根源。
CMP 2.0 试图在幕后执行关系维护和魔术,但开销和缺乏控制是一个问题 (IMO),它没有包含在 JPA
中。相反,JPA 实体应该是普通的旧 java 对象。这意味着如果您希望对关系的一侧所做的更改反映在另一侧,您必须自己进行更改。
令人困惑的是,如果您修改关系的一侧而不是另一侧,有时数据库会正确更新,有时不会,有时双方都会显示更改。这完全取决于您更改哪一侧,以及如何从数据库中缓存和刷新实体。拥有方的更改会持久保存到数据库中,并且 JPA 允许缓存,因此非拥有方可能不会反映这些更改,直到它从数据库中刷新。
最佳做法是,如果您希望对象模型与数据库保持同步,那么您对一侧所做的任何更改都应该由应用程序对另一侧进行。
我有以下两个实体:
@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?
}
我的困惑是为什么我需要 link 双向对象?
我试过带和不带 f.getPilots().add(p);
部分的代码,在 DB 中它看起来完全一样。但是,当我尝试对同一个飞行实体对象使用 f.getPilots();
时,它仅在我完成上述双向 linking 时显示。任何人都可以对此有所了解吗?我将不胜感激。提前致谢。
因为在 JPA 中您有 "one-way" 关系的概念。如果您不指定 "mapped by" 属性,您将不会创建 2 个单向关系(1:N 和 N:1)而不是双向 1:N 关系.
那么有人会问"why the heck do people need two one-way relationships"?答案是因为 JPA 是为了满足甚至奇怪的遗留数据库而构建的。 :-)
你的问题似乎是想问为什么你必须保持双向关系的双方,这是一个常见的问题和混淆的根源。
CMP 2.0 试图在幕后执行关系维护和魔术,但开销和缺乏控制是一个问题 (IMO),它没有包含在 JPA
中。相反,JPA 实体应该是普通的旧 java 对象。这意味着如果您希望对关系的一侧所做的更改反映在另一侧,您必须自己进行更改。
令人困惑的是,如果您修改关系的一侧而不是另一侧,有时数据库会正确更新,有时不会,有时双方都会显示更改。这完全取决于您更改哪一侧,以及如何从数据库中缓存和刷新实体。拥有方的更改会持久保存到数据库中,并且 JPA 允许缓存,因此非拥有方可能不会反映这些更改,直到它从数据库中刷新。
最佳做法是,如果您希望对象模型与数据库保持同步,那么您对一侧所做的任何更改都应该由应用程序对另一侧进行。