gpt4 book ai didi

java - JPA、NetBeans 和与自身的多对多关系

转载 作者:行者123 更新时间:2023-11-30 11:26:20 25 4
gpt4 key购买 nike

我遇到了一个表的问题,该表的表与自身有多对多的关系,因为一个要求可以有多个父项和多个子项。我基本上使用 NetBeans 向导从数据库创建实体,其他一切似乎都运行良好。但是在为这种父/子关系做单元测试时,我开始失败了。基本上,当我以某种方式将 child 添加到需求中时, child 最终也将 parent 作为 child 。

我相信在某种程度上与 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 和 requirementList1 的 parent 关系。

当我尝试添加一个 child 时,我会做类似的事情:

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

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

最佳答案

我想问题在于您将 child 添加到关系的错误一侧(您没有正确更新关系),具体取决于该关系中的 child 是谁。对于持久性部分,您必须将其添加到关系的拥有方,特别是属性 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 实现足以查看这是否是您的问题的原因。

关于java - JPA、NetBeans 和与自身的多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19848505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com