我试图在共享相同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约束错误。
我该如何解决这个问题?提前谢谢。
答案 0 :(得分:4)
由于您的类Stats拥有该关联,请尝试执行以下操作:
stats.setItem(item);
session.save(stats)
答案 1 :(得分:0)
Stats
实体中的@JoinColumn
注释尚未完成,必须指定属性referencedColumnName
。
public abstract java.lang.String referencedColumnName
(可选)此外键引用的列的名称 列。
@Entity
public class Stats {
@Id
@OneToOne
@JoinColumn(name = "reference", referencedColumnName = "reference")
@Fetch(FetchMode.SELECT)
private Item item;
// ...
}