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;

    ...
}

在我的应用程序中,当用户被合并时,配置文件会在数据库中更新。
但是,合并配置文件时,不会更新用户。

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

4

1 回答 1

2

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

JPA 2.1 的 Java 规范说:

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

因此,如果您想让两个实体都可以从两侧编辑,请删除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 的删除和重新插入,可能需要将 List 更改为 Set,如下所述:http: //assarconsulting.blogspot.fr/2009/08/why-hibernate-does-delete-all-then-re.html

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

于 2014-09-16T14:31:39.410 回答