如何使用JPA / Hibernate建立基本的多人关系?

时间:2013-03-13 10:49:02

标签: hibernate jpa spring-data-jpa

我有一个非常基本的多对多关系:人员和项目,设置如下:

人:

@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name = "person_project", 
joinColumns = @JoinColumn(name = "Person_Id"),
inverseJoinColumns = @JoinColumn(name = "Project_id"))
private Set<Project> projects = new HashSet<Project>();

项目:

@ManyToMany
@JoinTable(name = "person_project", 
joinColumns = @JoinColumn(name = "Project_Id"), 
inverseJoinColumns = @JoinColumn(name = "Person_id"))
private Set<Person> persons = new HashSet<Person>();

更新Person时,可能会指定新项目。我为Person设置了一个JPARepository,我使用saveAndFlush(...)来保存可能的新项目。

这适用于一个人。如果我添加一个新项目,它将与Person一起保存,并且数据库中的表正确更新。但是,如果我然后为另一个人添加相同的项目 - 它将从第一个人删除!第一个人的id将替换为连接表中第二个人的id。

是什么原因引起的?我的关系设置不正确吗?

2 个答案:

答案 0 :(得分:3)

您不会在映射的两半上使用相同的注释。第一部分定义连接表和列。映射的后半部分只需知道另一半的名称(在您的情况下为项目),它将从第一个注释中获取详细信息。要获得合适的解释,请参阅:Hibernate Many to Many Mapping

答案 1 :(得分:0)

如下所示更改项目可以解决问题:

@ManyToMany(mappedBy="projects")
private Set<Person> persons = new HashSet<Person>();

现在,当我将同一个项目添加到第二个人时,第一个项目将保持与该项目的相关性。

我仍然不知道为什么会这样,所以如果有人可以解释,请做!