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

时间:2015-07-14 22:25:00

标签: java hibernate jpa

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

+----------------------------------+   +----------------+-----------------+        
|              Item                |   |              Stats               |
+----------------+-----------------+   +----------------+-----------------+
| reference (PK) |  other data...  |   | reference (PK) |  other data...  |
+----------------+-----------------+   +----------------+-----------------+
|          ABCD  |      ...        |   |          ABCD  |      ...        |
|           XYZ  |      ...        |   |           XYZ  |      ...        |
+----------------+-----------------+   +----------------+-----------------+

其中Stats.referenceItem.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约束错误。

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

2 个答案:

答案 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;  

   // ...
}