【发布时间】:2015-07-14 22:24:59
【问题描述】:
我正在尝试在共享相同 PK 的两个实体之间建立OneToOne 关系:
+----------------------------------+ +----------------+-----------------+
| Item | | Stats |
+----------------+-----------------+ +----------------+-----------------+
| reference (PK) | other data... | | reference (PK) | other data... |
+----------------+-----------------+ +----------------+-----------------+
| ABCD | ... | | ABCD | ... |
| XYZ | ... | | XYZ | ... |
+----------------+-----------------+ +----------------+-----------------+
其中Stats.reference 是Item.reference 的FK:
alter table Stats
add constraint FK_8du3dv2q88ptdvthk8gmsipsk
foreign key (reference)
references Item;
此结构由以下带注释的类生成:
@Entity
public class Item {
@Id
private String reference;
@OneToOne(mappedBy = "item", optional = false)
@Cascade({CascadeType.SAVE_UPDATE})
@Fetch(FetchMode.SELECT)
private Stats stats;
// ...
}
@Entity
public class Stats {
@Id
@OneToOne
@JoinColumn(name = "reference")
@Fetch(FetchMode.SELECT)
private Item item;
// ...
}
一个新的Item 创建如下:
Item item = new Item();
item.setReference("ABC");
Stats stats = new Stats();
stats.setItem(item);
item.setStats(stats);
session.save(item);
我的问题是当我执行session.save(item) 时,INSERT 语句的顺序是错误的。
Hibernate 首先尝试插入Stats 表而不是Item,导致FK 约束错误。
我该如何解决这个问题?提前致谢。
【问题讨论】:
-
@boutaya 的回答很好,也给你的 forgein 键一个不同的名字。你也已经把它作为主键了。