TL;DR: 在第一眼看起来,模式可能看起来相同,但是 OneToOne 可能具有额外的 UNIQUE INDEX 约束。这保证了 OneToOne 关联。
这在
Doctrine ORM documentation of Association Mapping 中有很好的说明(我认为它不特定于 Hibernate)。
例如:
ManyToOne:
考虑表 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
与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);
唯一的区别是
UNIQUE INDEX
指令,它规定在
Product
表中不得出现两次
shipment.id
,从而保证了
OneToOne 关联。
save()
方法中实际上没有生成异常? - sql_dummysession.save(order1)
保存订单1,然后使用session.save(order2)
保存订单2,但是出现了异常org.hibernate.PropertyValueException: not-null property references a null or transient value
。 - sql_dummysave();
方法吗? - sql_dummy