2012-02-23 94 views
9

我有兩個例子,第一個是@OneToOne單向映射和第二個雙向。在單向映射中,擁有方表必須包含引用其他表的ID的連接列;那麼在雙向中它們都必須包含彼此的外鍵列。但是在使用autogenerate策略生成數據庫模式後,兩個示例對數據庫模式具有相同的效果。單向映射是正常的,但雙向示例只包含一個外鍵列,但它必須涉及對方的外鍵!@OneToOne單向和雙向

單向映射

@Entity 
public class Customer43 { 

@Id 
@GeneratedValue 
private Long id; 
private String firstName; 
private String lastName; 
private String email; 
private String phoneNumber; 
@OneToOne 
@JoinColumn(name = "address_fk") 
private Address43 address; 

// Getters, Setters and Constructors. 
} 

@Entity 
public class Address43 { 

@Id 
@GeneratedValue 
private Long id; 
private String street1; 
private String street2; 
private String city; 
private String state; 
private String zipcode; 
private String country; 

// Getters, Setters and Constructors. 
} 

雙向映射

@Entity 
public class Customer44 { 

@Id 
@GeneratedValue 
private Long id; 
private String firstName; 
private String lastName; 
private String email; 
private String phoneNumber; 
@OneToOne 
@JoinColumn(name = "address_fk") 
private Address43 address; 

// Getters, Setters and Constructors. 
} 

@Entity 
public class Address44 { 

@Id 
@GeneratedValue 
private Long id; 
private String street1; 
private String street2; 
private String city; 
private String state; 
private String zipcode; 
private String country; 
@OneToOne(mappedBy = "address") 
private Customer44 customer; 

// Getters, Setters and Constructors. 
} 

爲什麼數據庫模式輸出相同的,爲什麼雙向映射的作用類似單向?

回答

19

因爲您不瞭解雙向OneToOne如何映射。你不需要兩個外鍵。單一一個足以執行兩個表之間的聯接,在兩個方向上:

select a.* from address a inner join customer c on c.addressId = a.id; 
select c.* from customer c inner join address a on c.addressId = a.id; 

事實上,所述關聯是單向或雙向的不改變表是如何連接在一起。它只是改變了映射,並允許在兩個方向上瀏覽關聯。

在雙向關聯中,您總是擁有一個擁有的一面(它告訴如何映射關聯,使用哪個連接列)以及一個反面,您只需說:我是關聯的另一面,由目標實體中的此字段(mappedBy屬性值中的字段)映射。

+1

那麼,它們的優點或缺點是什麼? – 2012-02-25 14:04:59

+9

單向關聯的優勢在於管理更容易,因爲您只需保持一側。雙向關聯的優點是您可以在兩個方向上導航(獲取客戶的地址,或獲取地址的客戶)。 – 2012-02-25 23:21:22

+0

這是否適用於OneToMany和ManyToOne? – 2013-07-26 09:20:40

4

我剛剛在這方面做了一個實驗。如果你只是在下面這樣做,兩個表都將有外鍵:

@OneToOne 
private Address43 address; 

@OneToOne 
private Customer44 customer; 

現在你不需要做連接。我不確定這是否是一種好的做法。只要確保你沒有級聯。