2012-02-23 35 views
9

最初に@OneToOne単方向マッピングと第2の双方向である2つの例があります。単方向マッピングでは、所有側の表には、他の表のIDを参照する結合列が含まれている必要があります。双方向では両方とも互いに外部キー列を含んでいなければなりません。しかし、自動生成戦略を使用してデータベーススキーマを生成した後、2つの例はデータベーススキーマに同じ効果をもたらします。単方向マッピングは正常ですが、双方向の例には1つの外部キー列しか含まれていませんが、お互いの外部キーを含む必要があります。@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のマッピング方法がわからないためです。 2つの外部キーは必要ありません。単一のものは両方向に、両方のテーブル間の結合を行うのに十分である:

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

だから、そのメリットとデメリットは何ですか? –

+9

一方向の関連付けの利点は、片面を維持するだけで済むため、管理が簡単だということです。双方向の関連付けの利点は、双方向にナビゲートできることです(顧客の住所を取得するか、住所の顧客を取得することができます)。 –

+0

これはOneToManyとManyToOneに適用されますか? –

4

私はちょうどこれについての実験をしました。下のようにすると、両方のテーブルには外部キーが設定されます。

これで結合を行う必要はありません。私はそれが良い習慣であるかどうかわからない。あなたがCASCADESを持っていないかどうかだけを確認してください。