JPA,NetBeans和很多人之间的关系

时间:2013-11-07 23:03:46

标签: java jpa netbeans eclipselink

由于要求可以有多个父母和多个孩子,因此我遇到了一张桌子,桌子上有一张与自身有多对多关系的桌子。我基本上使用NetBeans向导从数据库创建实体,其他一切似乎工作正常。但是对这种父母/子女关系进行单元测试后,我开始失败了。基本上,当我将一个孩子添加到某个要求中时,孩子最终也会将父母作为孩子。

我认为某种方式与JoinTable相关,其中2列指向同一个键。

这是相关的实体代码映射:

@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;

Database Design

如果需要,可以在此处获取代码:https://javydreamercsw@bitbucket.org/javydreamercsw/validation-manager

修改 问题很难回答,因为实际上它不起作用。理论上,requirementList应该有child,requiredList1是关系的父级。

当我尝试添加孩子时,我会做类似的事情:

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

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

1 个答案:

答案 0 :(得分:1)

我认为问题在于您将孩子添加到关系的错误一侧(您没有正确更新关系),具体取决于该关系中的孩子。从持久性部分开始,您必须将其添加到关系的拥有方,特别是属性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规范摘录,请参阅this answer

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

为了在JPA中实现equals()/ hashCode(),请检查this answer,尽管保留默认的Object实现就足以看出这是否是导致问题的原因。