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指示上面的代码在应用程序崩溃之前运行,但我仍然得到相同的错误.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值