双向一对一映射到多个字段

时间:2011-09-29 20:51:52

标签: java java-ee jpa

我有一个名为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类?

2 个答案:

答案 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建议的那样?映射,使用和更快地运行会更简单。