Java 一个OneToMany关系的合并,在jointable中执行INSERT语句,导致ConstraintViolationException
我在JPA存储库中使用Spring数据。我有以下实体: 母公司:Java 一个OneToMany关系的合并,在jointable中执行INSERT语句,导致ConstraintViolationException,java,hibernate,jpa,spring-data-jpa,one-to-many,Java,Hibernate,Jpa,Spring Data Jpa,One To Many,我在JPA存储库中使用Spring数据。我有以下实体: 母公司: @Entity public class Parent { @Id String id; @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE}) Set<Child> children; } 首先,我第一次用以下结构保存一个父级,一切都是正确的: { "id" :
@Entity
public class Parent {
@Id
String id;
@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE})
Set<Child> children;
}
首先,我第一次用以下结构保存一个父级,一切都是正确的:
{
"id" : "1",
"children" : [{
id: "500",
value: "abc"
}]
}
现在,我在我的父表id:1
、子表id:500、值:abc
中有一个条目,并且在jointable(父/子)中有一个关系1-500
。
如果我没有,请尝试再次保存id为1的父级,并在子级中保存一个已更改的值:
{
"id" : "1",
"children" : [{
id: "500",
value: "def"
}]
}
我可以看到jpa正在执行一个updatestation,其中id=500updatechildren SET value='def',这很好。但是,它还会尝试为jointable执行insert语句:
插入到父项\u子项(父项,子项)值(1500)
这会导致ConstraintViolationException,因为该项已存在于jointable中。
如何防止JPA执行此insert语句?您使用哪种方法在数据库中插入?您使用的是持久化方法还是sevaOrUpdate方法?
您能在保存数据的地方显示一些代码吗?张贴控制器。您应该为第二个更新请求发出PUT请求。仅对新记录使用POST。不管怎样,发布你的控制器代码。你也没有向我们展示实体的全部代码。Child
中是否有自定义的equals/hashCode
实现?
{
"id" : "1",
"children" : [{
id: "500",
value: "abc"
}]
}
{
"id" : "1",
"children" : [{
id: "500",
value: "def"
}]
}