最初の例は@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.
}
データベーススキーマの出力が同じである理由と、双方向マッピングが単方向のように機能するのはなぜですか?
双方向の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
属性値のフィールド)。
私はこれについて実験をしました。以下でこれを行うと、両方のテーブルに外部キーがあります。
@OneToOne
private Address43 address;
@OneToOne
private Customer44 customer;
これで、参加する必要はありません。それが良い習慣かどうかはわかりません。 CASCADESがないかどうかを確認してください。