web-dev-qa-db-ja.com

単方向および双方向の@OneToOne

最初の例は@OneToOne単方向マッピングで、2番目の例は双方向です。単方向マッピングでは、所有側のテーブルに、他のテーブルのIDを参照する結合列が含まれている必要があります。次に、双方向では、両方に相互の外部キー列が含まれている必要があります。ただし、自動生成戦略を使用してデータベーススキーマを生成した後、2つの例がデータベーススキーマに同じ影響を及ぼします。単方向マッピングは正常ですが、双方向の例には1つの外部キー列しか含まれていませんが、相互の外部キーが含まれている必要があります。

単方向マッピング

@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.
}

データベーススキーマの出力が同じである理由と、双方向マッピングが単方向のように機能するのはなぜですか?

10
Rahman Usta

双方向のOneToOneがどのようにマッピングされるかを理解していなかったためです。 2つの外部キーは必要ありません。両方のテーブル間で両方向の結合を実行するには、1つで十分です。

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属性値のフィールド)。

19
JB Nizet

私はこれについて実験をしました。以下でこれを行うと、両方のテーブルに外部キーがあります。

@OneToOne
private Address43 address;

@OneToOne
private Customer44 customer;

これで、参加する必要はありません。それが良い習慣かどうかはわかりません。 CASCADESがないかどうかを確認してください。

4
batbaatar