我有一个非常基本的多对多关系:人员和项目,设置如下:
人:
@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。
是什么原因引起的?我的关系设置不正确吗?
答案 0 :(得分:3)
您不会在映射的两半上使用相同的注释。第一部分定义连接表和列。映射的后半部分只需知道另一半的名称(在您的情况下为项目),它将从第一个注释中获取详细信息。要获得合适的解释,请参阅:Hibernate Many to Many Mapping
答案 1 :(得分:0)
如下所示更改项目可以解决问题:
@ManyToMany(mappedBy="projects")
private Set<Person> persons = new HashSet<Person>();
现在,当我将同一个项目添加到第二个人时,第一个项目将保持与该项目的相关性。
我仍然不知道为什么会这样,所以如果有人可以解释,请做!