2

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

人:

@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 设置了 JPARepository,我使用 saveAndFlush(...) 来保存 Person 可能的新项目。

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

这是什么原因造成的?我的关系设置不正确吗?

4

2 回答 2

3

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

于 2013-03-13T15:45:04.587 回答
0

It looks like changing Project as follows fixes the problem:

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

Now when I add the same project to a second person, the first one will remain related to that project as it should.

I still don't know why this works, so If someone can explain it, please do!

于 2013-03-13T12:20:02.663 回答