2011-09-29 76 views
3

我有一個名爲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; 
} 

不過,我不知道如何正確地標註在Movement類的flight領域。我想通了Flight類有是關係的擁有方,因爲如果不是這樣,沒有辦法判斷一個特定FlightMovementdeparturearrival

@OneToOne 
private Movement departure; 
@OneToOne 
private Movement arrival; 

然而這,會造成問題。我不能在Movement類的flight字段映射在這兩個領域:

// This obviously does not work 
@OneToOne(mappedBy = "departure") 
@OneToOne(mappedBy = "arrival") 
private Flight flight; 

我怎麼會去正確標註這一點,同時具有departurearrival場正​​確地引用Movement,仍然能夠有flight字段上Movement類參考Flight類?

+0

爲什麼動作需要知道他們在什麼飛行? – corsiKa

回答

3

如果你真的需要一個雙向的關係,那麼你就需要有在運動領域,其中一人總是被空:

@OneToOne(mappedBy = "departure") 
private Flight departureFlight; 

@OneToOne(mappedBy = "arrival") 
private Flight arrivalFlight; 

但是你可以有一個單一的getter:

public Flight getFlight() { 
    return departureFlight == null ? arrivalFlight : departureFlight; 
} 
+0

人們不應該忘記,爲了使用JPA工具,仍應該實現「常規」獲取者。 – MaDa

+0

和+1,更好的主意。 – MaDa

+0

@MaDa:沒有。 JPA可以直接從字段中獲取/設置值,而不需要getter/setter。 –

0

如果您需要雙向關係,則可以將關係類型更改爲@ManyToMany,以便您可以使用具有附加狀態列的連接表。在那裏你可以指定它是到達還是離開。

Wikibooks提供了一個如何映射它的例子。儘管如此,這種關係在代碼中處理起來非常麻煩。或者根據glowcoder的建議,或許你根本不需要雙向關係?映射,使用和運行速度會更加簡單。