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