由于要求可以有多个父母和多个孩子,因此我遇到了一张桌子,桌子上有一张与自身有多对多关系的桌子。我基本上使用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;
如果需要,可以在此处获取代码:https://javydreamercsw@bitbucket.org/javydreamercsw/validation-manager
修改 问题很难回答,因为实际上它不起作用。理论上,requirementList应该有child,requiredList1是关系的父级。
当我尝试添加孩子时,我会做类似的事情:
requirement.getRequirementList().add(requirement2);
<Persist requirement here>
假设这两个要求是正确的有效实体。
答案 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实现就足以看出这是否是导致问题的原因。