JPA中的多对多双向映射

时间:2014-09-16 14:08:24

标签: java jpa jpa-2.1

我有以下JPA实体 配置文件包含许多用户,用户拥有许多配置文件:

@Entity
public class Profile implements Serializable {

    @Id
    private Long id;

    @ManyToMany(cascade = CascadeType.ALL)
    private List<User> users;

    ...
}

@Entity
public class User implements Serializable {

    @Id
    private Long id;

    @ManyToMany(mappedBy = "users")
    private List<Profile> profiles;

    ...
}

在我的应用程序中,当用户为merged时,会在数据库上更新配置文件 但是,当个人资料为merged时,用户不会更新。

是否可以映射我的实体以使双方合并其列表?
我正在使用JPA 2.1和Hibernate。

1 个答案:

答案 0 :(得分:2)

您的Profile实体是自己的一方或关系。它可以管理关系,因此为了更新User,您还必须更新Profile或进行手动SQL调用。

Java Specification for JPA 2.1说:

  

•对于多对多双向关系,任何一方都可能是拥有方

因此,如果您想要从两侧创建两个实体,请删除mappedBy元素并分配必要的级联。但是我不确定它在Hibernate中是否有效(没有尝试过),请参阅这个关于映射的文档,没有关于m:m的信息没有拥有方:http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch07.html#collections-bidirectional

否则,您可能需要遍历Profile实体中的集合,然后更改它们。例如:

for( User user : profile.getUsers() ) {
    user.setSomething(.....);
}

session.merge(profile);

可能需要将列表更改为设置以避免Hibernate的删除和重新插入,如下所述:http://assarconsulting.blogspot.fr/2009/08/why-hibernate-does-delete-all-then-re.html

另外,不要忘记equals()hashCode()方法覆盖