TL;DR: スキーマは一見同じように見えるかもしれませんが、OneToOne には追加のUNIQUE INDEX
制約がある場合があります。これにより、1対 1 の関連付けが保証されます。
これは、アソシエーション マッピングの Doctrine ORM ドキュメントによってうまく説明されています (Hibernate に固有のものではないと思います)。
例:
多対一:
テーブルUser
を考えてみましょう。Address
列には、列User.address_id
への ManyToOne 関連付けがありAddress.id
ます。これはSQLになります:
CREATE TABLE User (
id INT AUTO_INCREMENT NOT NULL,
address_id INT DEFAULT NULL,
PRIMARY KEY(id)
) ENGINE = InnoDB;
CREATE TABLE Address (
id INT AUTO_INCREMENT NOT NULL,
PRIMARY KEY(id)
) ENGINE = InnoDB;
ALTER TABLE User ADD FOREIGN KEY (address_id) REFERENCES Address(id);
一対一:
ここで、表Product
とについて考えてみますShipment
。一方、列Product.shipment_id
は列に対して OneToOne (一方向) の関連付けを持っていShipment.id
ます。これはSQLになります:
CREATE TABLE Product (
id INT AUTO_INCREMENT NOT NULL,
shipment_id INT DEFAULT NULL,
UNIQUE INDEX UNIQ_6FBC94267FE4B2B (shipment_id),
PRIMARY KEY(id)
) ENGINE = InnoDB;
CREATE TABLE Shipment (
id INT AUTO_INCREMENT NOT NULL,
PRIMARY KEY(id)
) ENGINE = InnoDB;
ALTER TABLE Product ADD FOREIGN KEY (shipment_id) REFERENCES Shipment(id);
唯一の違いは、テーブル内で 2 回発生してはUNIQUE INDEX
ならないことを指示するディレクティブです。これにより、1対 1 の関連付けが保証されます。shipment.id
Product