我有一个名为Flight
的域类,代表已经飞过的航班。我有另一个名为Movement
的班级,可以代表出发或到达,包含日期和时间以及发生运动的机场。
@Entity
public class Flight implements Serializable {
private Movement departure;
private Movement arrival;
}
@Entity
public class Movement implements Serializable {
@Temporal(TemporalType.TIMESTAMP)
private Date dateTime;
@ManyToOne
private Airport airport;
private Flight flight;
}
但我不确定如何正确注释flight
类中的Movement
字段。我认为Flight
类必须是关系的拥有方,因为如果不是,则无法判断特定Movement
的{{1}}是否为{{1} }或Flight
:
departure
然而,这会带来一个问题。我无法在arrival
类中映射两个字段中的@OneToOne
private Movement departure;
@OneToOne
private Movement arrival;
字段:
flight
我如何正确地对此进行注释,让Movement
和// This obviously does not work
@OneToOne(mappedBy = "departure")
@OneToOne(mappedBy = "arrival")
private Flight flight;
字段正确引用departure
,并且仍然可以在arrival
字段上Movement
类引用flight
类?
答案 0 :(得分:3)
如果你真的需要一个双向关系,那么你需要移动中的一个字段,其中一个字段始终为空:
@OneToOne(mappedBy = "departure")
private Flight departureFlight;
@OneToOne(mappedBy = "arrival")
private Flight arrivalFlight;
但你可以有一个吸气剂:
public Flight getFlight() {
return departureFlight == null ? arrivalFlight : departureFlight;
}
答案 1 :(得分:0)
如果您需要双向关系,可以将关系类型更改为@ManyToMany
,这样您就可以使用具有附加状态列的连接表。在那里你可以指定它是到达还是离开。
Wikibooks提供了如何映射它的示例。但是,这种关系在代码中处理起来非常麻烦。
或者你可能根本不需要双向关系,就像glowcoder建议的那样?映射,使用和更快地运行会更简单。