DD.*_*DD. 36 hibernate one-to-one many-to-one
我看不出多对一关系与OneToOne关系的架构有什么不同:
@Entity
public class Order {
@ManyToOne
@JoinColumn(nullable = false)
private Address address;
Run Code Online (Sandbox Code Playgroud)
VS
@Entity
public class Order {
@OneToOne
@JoinColumn(nullable = false)
private Address address;
Run Code Online (Sandbox Code Playgroud)
有什么区别吗?
小智 37
它们在模式上看起来完全相同,但Hibernate Layer有所不同.
如果您尝试这样的事情:
Address address = new Address();
Order order1 = new Order();
order1.setAddress(address);
Order order2 = new Order();
order2.setAddress(address);
save();
Run Code Online (Sandbox Code Playgroud)
一切都会变好.但是,保存后,如果你尝试获得订单:
@OneToOne case:
org.hibernate.HibernateException: More than one row with the given identifier was found: 1
@ManyToOne case:
SUCCESS
Run Code Online (Sandbox Code Playgroud)
当然,在这两种情况下,您的Address类应该看起来不同.
TL;DR:乍一看,架构可能看起来相同,但 OneToOne 可能有一个额外的UNIQUE INDEX约束。这保证了一对一关联。
Association Mapping 的 Doctrine ORM 文档很好地说明了这一点(我不认为它特定于 Hibernate)。
一个例子:
考虑这些表User,Address并且该列User.address_id与该列具有多对一关联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);
Run Code Online (Sandbox Code Playgroud)
现在,考虑表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);
Run Code Online (Sandbox Code Playgroud)
唯一的区别是指令规定表中UNIQUE INDEX不得出现两次。这保证了一对一关联。shipment.idProduct
| 归档时间: |
|
| 查看次数: |
12412 次 |
| 最近记录: |