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.idProduct