Java JPA、NetBeans和多对多与自我的关系

Java JPA、NetBeans和多对多与自我的关系,java,jpa,netbeans,eclipselink,Java,Jpa,Netbeans,Eclipselink,我对一个表本身具有多对多关系的表有问题,因为一个需求可以有多个父项和多个子项。我基本上是使用NetBeans向导从数据库创建实体的,其他一切似乎都很好。但是,对这种父/子关系进行单元测试时,我开始失败。基本上,当我在需求中添加一个子项时,不知何故,子项最终也会将父项作为子项 我相信这与JoinTable有某种联系,JoinTable有两列指向同一个键 以下是相关的实体代码映射: @JoinTable(name = "requirement_has_requirement", joinColumn

我对一个表本身具有多对多关系的表有问题,因为一个需求可以有多个父项和多个子项。我基本上是使用NetBeans向导从数据库创建实体的,其他一切似乎都很好。但是,对这种父/子关系进行单元测试时,我开始失败。基本上,当我在需求中添加一个子项时,不知何故,子项最终也会将父项作为子项

我相信这与JoinTable有某种联系,JoinTable有两列指向同一个键

以下是相关的实体代码映射:

@JoinTable(name = "requirement_has_requirement", joinColumns = {
    @JoinColumn(name = "requirement_id", referencedColumnName = "id"),
    @JoinColumn(name = "requirement_version", referencedColumnName = "version")}, inverseJoinColumns = {
    @JoinColumn(name = "parent_requirement_id", referencedColumnName = "id"),
    @JoinColumn(name = "parent_requirement_version", referencedColumnName = "version")})
@ManyToMany
private List<Requirement> requirementList;
@ManyToMany(mappedBy = "requirementList")
private List<Requirement> requirementList1;
@JoinTable(name=“requirement\u有需求”,joinColumns={
@JoinColumn(name=“requirement\u id”,referencedColumnName=“id”),
@JoinColumn(name=“requirement\u version”,referencedColumnName=“version”)},inverseJoinColumns={
@JoinColumn(name=“parent\u requirement\u id”,referencedColumnName=“id”),
@JoinColumn(name=“parent\u requirement\u version”,referencedColumnName=“version”)}
@许多
私人清单要求清单;
@ManyToMany(mappedBy=“requirementList”)
私人清单要求清单1;

如果需要,可在此处获取代码:

编辑 这些问题很难回答,因为事实上它不起作用。理论上,requirementList应该有子级,requirementList 1是关系的父级

当我尝试添加孩子时,我会执行以下操作:

requirement.getRequirementList().add(requirement2);
<Persist requirement here>
requirement.getRequirementList().add(requirement2);

假设这两个需求是正确有效的实体。

我认为问题在于您将子项添加到关系的错误端(您没有正确更新关系),这取决于该关系中的子项是谁。从持久性部分开始,您必须将其添加到关系的拥有方,特别是属性
requirementList
。另一方面,您的职责还包括正确更新不属于您的部分(requirementList1)

因此,请尝试以下方法:

Requirement requirementToUpdate = em.find(Requirement.class, pk);//replace pk with your PrimaryKey value
Requirement newRequirement = new Requirement();//fill in the properties

newRequirement.getRequirementList1().add(requirementToUpdate);//this is very important for your code
requirementToUpdate.getRequirementList().add(newRequirement);//this is very important for persistence
em.persist(newRequirement);//this should not insert anything in the 'requirement_has_requirement' table
em.persist(requirementToUpdate);//this should update the 'requirement_has_requirement' table
有关更新双边关系的JPA规范摘录,请参阅

也可以考虑添加一些级联(特别是在持久性和合并)上。


要在JPA中实现equals()/hashCode(),请进行检查,尽管保留默认的对象实现就足以确定这是否是问题的原因。

是您在说“父-子”时所说的多对多关联吗?它可能在您的
@JoinTable
注释中。您可以让JPA以这种方式在数据库中生成不表示所需关系的条目。在你提交之前,它们看起来是对的,但是当你再次获取它们时,它们就错了。实体在bitbucket回购中的什么位置?@mwhs:是的,是多对多。直接指向实体的链接: