2017-09-21 54 views
0

Iam对于我的案例中的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属性而不生成重复项。正如我所说,它似乎很容易,我只是因为遇到不同的异常而遇到困难。并正确的方向来“修复”正确的配置:)

感谢您的任何帮助。

编辑:

OK,它似乎是它是一个多对多的关系。即使一个人只能有一个属性?但是一个不同的人也可以拥有。 但现在我有这个级联持久/合并问题。

如:

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.. 

同样的情况,如果只是想要一个新的属性添加到人一个。我必须将现有属性的整个列表另外发送给新的属性。

+0

您必须使用@ManyToMany – wolverine

回答

0

这些注释仅在存在指向其他实体(表)或其他类(Bean)的链接时才需要。

对于为例,如果您有其他实体呼叫“地址”有不同的情况:

如果一个人是删除你应该使用级联删除他的地址了。

如果一个人可以有一个或多个地址,您应该使用OneToMany。

如果很多人可以有很多地址,你应该使用ManyToMany。 您可以默认使用他。

它是类Bean之间的一种联系。

+0

声音清晰。所以对我来说它是一个@ManyToMany。现在我该如何级联?因为我想坚持和合并(导致重复),但不要删除,如果其他人仍然有这个属性。我的猜测是:'@ManyToMany(cascade = {CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REFRESH,CascadeType.DETACH},orphanRemoval = true)'但孤儿删除似乎不可能ManyToMany并得到IllegalStateException:重复上的多个表示。 –

+0

你是对的,如果你有一个ManyToMany孤儿删除是不可能的。它是唯一的豆吗?我是个人?如果它是唯一一个可以制作一些功能并在程序中调用它们的程序。不幸的是,JPA没有解决所有特殊要求的例外情况。 – F0XS

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