Hibernation ManyToOne vs OneToOne

Je ne vois aucune différence dans le schéma d'une relation à plusieurs contre une relation à une:

@Entity
public class Order {

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

et

@Entity
public class Order {

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

quelle Est la différence?

30
demandé sur DD. 2013-08-27 12:22:53

4 réponses

ils sont exactement les mêmes sur le schéma mais il y a une différence sur la couche D'hibernation.

Si vous essayez quelque chose comme ça:

Address address = new Address();
Order order1 = new Order();
order1.setAddress(address);
Order order2 = new Order();
order2.setAddress(address);
save();

tout ira bien. Mais, après l'enregistrement si vous essayez de mettre en Ordre:

@OneToOne case:
org.hibernate.HibernateException: More than one row with the given identifier was found: 1

@ManyToOne case:
SUCCESS

bien sûr, votre classe D'adresse devrait être différente dans les deux cas.

29
répondu paulek 2013-08-27 11:09:28

il devrait normalement y avoir une contrainte unique sur le address_id joindre colonne dans le cas d'une association OneToOne, pour garantir qu'une seule commande peut avoir une adresse donnée.

5
répondu JB Nizet 2013-08-27 08:25:50

Ceci indique que les deux côtés de la relation sont mieux servis en ayant la même clé primaire. plus de sens de cette façon puisque les deux côtés sont associés un et un seul ordre dans le cas du @OneToOne relation.

0
répondu Progster219 2018-01-06 09:51:50

ceci est bien illustré par le ORM Doctrine de la documentation de Cartographie de l'Association (Je ne pense pas que ce soit spécifique à L'hibernation).

ManyToOne:

Examiner les tableaux User et Address alors que la colonne User.address_id a une association très étroite avec Address.id colonne. Ce serait le 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); 

OneToOne:

maintenant, considérez les tableaux Product et Shipment, alors que la colonne Product.shipment_id a une OneToOne association (unidirectionnelle) à la Shipment.id colonne. Ce serait le 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);

la différence est le UNIQUE INDEX clause qui dicte qu'il ne doit pas y avoir un shipment.id se produisant deux fois dans le Product tableau. C'est la garantie d' Toone association.

0
répondu agoldev 2018-03-24 14:55:51