我有以下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。
答案 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()
方法覆盖