具有相同 PK 的 JPA/Hibernate OneToOne 双向关系中的插入顺序错误

Tob*_*ías 6 java hibernate jpa

OneToOne我正在尝试在共享相同 PK 的两个实体之间建立关系:

+----------------------------------+   +----------------+-----------------+        
|              Item                |   |              Stats               |
+----------------+-----------------+   +----------------+-----------------+
| reference (PK) |  other data...  |   | reference (PK) |  other data...  |
+----------------+-----------------+   +----------------+-----------------+
|          ABCD  |      ...        |   |          ABCD  |      ...        |
|           XYZ  |      ...        |   |           XYZ  |      ...        |
+----------------+-----------------+   +----------------+-----------------+
Run Code Online (Sandbox Code Playgroud)

其中Stats.referenceFK 为Item.reference

alter table Stats 
    add constraint FK_8du3dv2q88ptdvthk8gmsipsk 
    foreign key (reference) 
    references Item;
Run Code Online (Sandbox Code Playgroud)

该结构是从以下带注释的类生成的:

@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;  

   // ...
}
Run Code Online (Sandbox Code Playgroud)

一个新的Item创建如下:

Item item = new Item();
item.setReference("ABC");
Stats stats = new Stats();
stats.setItem(item);
item.setStats(stats);
session.save(item);
Run Code Online (Sandbox Code Playgroud)

我的问题是当我执行session.save(item)INSERT 语句时顺序错误。Hibernate首先尝试插入Stats表而不是插入Item,导致FK约束错误。

我该如何解决这个问题?提前致谢。

Bil*_*BBB 4

由于您的班级 Stats 拥有该关联,请尝试执行以下操作:

stats.setItem(item);
session.save(stats)
Run Code Online (Sandbox Code Playgroud)