java primary,java – 键’PRIMARY’的重复条目’string1-string2′
在使用hibernate和jpa通過MySQL數據庫的Spring MVC應用程序中,每當我嘗試保存包含子實體的父實體時,我都會收到有關子實體的以下錯誤消息:
Duplicate entry 'string1-string2' for key 'PRIMARY'
這里,string1和string2指的是子實體的復合主鍵的兩個部分.我該如何解決這個錯誤?
以下是在父地址實體中定義實體之間關系的方式:
@ManyToOne(cascade = { CascadeType.ALL }, fetch=FetchType.EAGER)
@JoinColumns({ @JoinColumn(name = "usecode", referencedColumnName = "code", insertable = false, updatable = false),
@JoinColumn(name = "usecodesystem", referencedColumnName = "codesystem", insertable = false, updatable = false)
})
public HL7GeneralCode use;
以下是在子GeneralCode實體中定義關系的方式:
@OneToMany(mappedBy = "use", cascade = {CascadeType.ALL})
private Set addresses;
可以讀取GeneralCode實體的完整代碼at this link.
可以在at this link找到復合主鍵類的代碼.
并且可以在at this link找到由Address擴展的BaseEntity類.
我已經閱讀了很多關于此錯誤消息的帖子.其他帖子的答案不能解決我的錯誤消息,并且它們通常不解決我的實體使用復合主鍵的事實.
編輯:
持久化地址的代碼是:
@Override
public void savehl7Address(HL7Address addr) {
if ((Integer)addr.getId() == null) {
System.out.println("[[[[[[[[[[[[ about to persist address ]]]]]]]]]]]]]]]]]]]]");
this.em.persist(addr);}
else {
System.out.println("]]]]]]]]]]]]]]]]]] about to merge address [[[[[[[[[[[[[[[[[[[[[");
this.em.merge(addr);}
}
第二次編輯:
我試著按照@ Ben75的建議,但是代碼在this.em.persist(addr.getUse());行崩潰了.請注意,他的if子句不適合我的實際對象模型,因此我將下面的if子句更改為if(addr.getUse()!= null&& addr.getId()== null).這是我的代碼.
@Override
public void savehl7Address(HL7Address addr) {
if(addr.getUse() != null && addr.getId()==null){
//this next line prints in the stack trace right before the app crashes
System.out.println("about to this.em.persist(addr.getUse());");
//HL7GeneralCode is not persistent yet
this.em.persist(addr.getUse());
//since there is a cascade ALL on the adresses relationship addr is now persistent
return;
}
System.out.println("=========================== inside jpahl7patientrespository.savehl7Address(addr)");
if ((Integer)addr.getId() == null) {
System.out.println("[[[[[[[[[[[[ about to persist address ]]]]]]]]]]]]]]]]]]]]");
this.em.persist(addr);}
else {
System.out.println("]]]]]]]]]]]]]]]]]] about to merge address [[[[[[[[[[[[[[[[[[[[[");
this.em.merge(addr);}
}
HL7Address的相關部分現在是:
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumns({ @JoinColumn(name = "usecode", referencedColumnName = "code", insertable = false, updatable = false),
@JoinColumn(name = "usecodesystem", referencedColumnName = "codesystem", insertable = false, updatable = false)
})
public HL7GeneralCode use;
HL7GeneralCode的相關部分現在是:
@OneToMany(mappedBy = "use")
private Set addresses;
我該如何解決這個錯誤?
第三次編輯:
我通過將以下代碼添加到保存地址方法來遵循ben75的建議:
if(addr.getUse() != null && !this.em.contains(addr.getUse())){
System.out.println("about to this.em.persist(addr.getUse());");
this.em.persist(addr.getUse());return;
}
不幸的是,盡管堆棧跟蹤SYSO指示上面的代碼在應用程序崩潰之前運行,但我仍然得到相同的錯誤.
總結
以上是生活随笔為你收集整理的java primary,java – 键’PRIMARY’的重复条目’string1-string2′的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 抽油烟机多少瓦的比较好啊?
- 下一篇: oracle 存储过程字符替换,Orac