2

我遇到了一个表的问题,因为一个表有一个多对多的关系,因为一个需求可以有多个父母和多个孩子。我基本上使用 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

编辑 这些问题很难回答,因为实际上它不起作用。理论上requireList 应该有child 和requirementList1 的父关系。

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

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

假设这两个要求是适当的有效实体。

4

1 回答 1

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 规范的摘录,请参阅此答案

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

要在 JPA 中实现 equals()/hashCode(),请检查此答案,尽管保留默认的 Object 实现足以查看这是否是您的问题的原因。

于 2013-11-21T20:22:44.487 回答