46

多対一の関係と一対一の関係のスキーマに違いは見られません。

@Entity
public class Order {

    @ManyToOne
    @JoinColumn(nullable = false)
    private Address address;

@Entity
public class Order {

    @OneToOne
    @JoinColumn(nullable = false)
    private Address address;

違いはありますか?

4

4 に答える 4

3

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

于 2018-03-24T14:55:51.523 に答える