我对我的案例的JPA关系定义有点困惑,可以使用一些帮助来使其正确。即使看起来很容易,我也会一直遇到不同的错误。
实施例一:
@Entity
public class Person
{
...
@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) // cascade what?
private List<Attribute> attribs;
}
@Entity
public class Attribute
{
@Id
private Integer id;
...
}
所有人都可以拥有相同的属性,依此类推。
关键是Person应该能够级联Persist / merge属性而不会产生重复。
正如我所说的那样,它似乎很容易,我只是遇到了不同的例外我遇到了。以及“修正”正确配置的正确方向:)
感谢您的帮助。
修改
好吧,它似乎是一个ManyToMany关系。即使一个人只能拥有一次属性?但是一个不同的人也可以拥有它。 但现在我有这个级联持久/合并问题。
例如:
Person a = new Person();
a.add(new Attribute(1));
a.add(new Attribute(2));
repo.save(a); //worked and persists Attributes
Person b = new Person();
a.add(new Attribute(1));
a.add(new Attribute(2));
a.add(new Attribute(3));
repo.save(b); //Error: IllegalStateException: Multiple representations of the same entity ..Attribute.. are being merged. Detached ..Attribute..
如果只想向Person a添加新属性,也会发生同样的情况。我必须将新的现有属性列表发送到新的属性。
答案 0 :(得分:0)
只有存在指向另一个实体(表)或另一个类(Bean)的链接时,才需要这些注释。
例如,如果您有另一个实体调用“地址”,则有不同的情况:
如果Person被删除,你应该使用cascade来删除他的地址。
如果某人可以拥有一个或多个地址,则应使用OneToMany。
如果许多人可以拥有多个地址,则应使用ManyToMany。 你可以默认使用他。
这是班级之间的一种联系。
答案 1 :(得分:0)
您不能简单地添加具有相同标识符的新属性。您需要添加现有的持久性实例:
Attribute a1 = new Attribute(1);
Attribute a2 = new Attribute(2);
Attribute a3 = new Attribute(3);
//an existing instance
Attribute a4 = entityManager.getReference(Attribute.class, 4);
Person a = new Person();
a.add(a1);
a.add(a2);
repo.save(a);
Person b = new Person();
a.add(a1);
a.add(a2);
a.add(a3);
a.add(a4);
repo.save(b);