定义JPA简单关系

时间:2017-09-21 14:23:44

标签: hibernate jpa

我对我的案例的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添加新属性,也会发生同样的情况。我必须将新的现有属性列表发送到新的属性。

2 个答案:

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