我在使用JPA(休眠)和集合/列表之间的关联时遇到麻烦。 我基本上拥有的是一个类似于DOM-Element的Object,因为它具有Children / Children的collection / List和DOM根元素引用。 现在,我已经创建了一个用于测试的数据库,其中包含以下数据结构:
-root
--child1
--- child1.1
---- child1.1.1
--- child1.2
---- child1.2.1
---- child1.2.2
--- child1.3
现在,当我使用EntityManager
检索对象时,所有子对象均已正确初始化(此处的重点是子对象!)。 除根节点之外的所有。
出于某种原因,该根将9个子级添加到其子级集合中。这9个孩子是9xchild1!
我感觉是由于事实,即List的关联是父对象的mappedBy
,并且由于根元素没有父元素,所以这里会发生错误。
但是,由于我是JPA的初学者,所以我不知道如何“修复”此行为!拜托,有人可以指出我正确的方向。
这是到目前为止的代码:
这是“ DOM-ELEMENT”对象
@Entity
class ProductNode extends EmmettEntity implements IProductNode {
@OneToOne(targetEntity = ProductStructure.class)
private IProductStructure productStructure;
@OneToOne(targetEntity = Product.class)
private IProduct referenceProduct;
@ManyToOne(targetEntity = ProductNode.class , fetch=FetchType.LAZY)
private IProductNode parentNode;
@Embedded
private final Position position = new Position();
@OneToMany(targetEntity = ProductNode.class, mappedBy="parentNode")
private List<IProductNode> children = new ArrayList<>();
// needed for the use of JPA
protected ProductNode() {}
ProductNode(IProduct refProduct, IProductNode parentNode, IProductStructure ps){
Objects.requireNonNull(refProduct);
Objects.requireNonNull(ps);
this.referenceProduct = refProduct;
this.productStructure = ps;
this.parentNode = parentNode;
}
// removed getters - setters, equals() etc.
}
@Entity
class ProductNode extends EmmettEntity implements IProductNode {
@OneToOne(targetEntity = ProductStructure.class)
private IProductStructure productStructure;
@OneToOne(targetEntity = Product.class)
private IProduct referenceProduct;
@ManyToOne(targetEntity = ProductNode.class , fetch=FetchType.LAZY)
private IProductNode parentNode;
@Embedded
private final Position position = new Position();
@OneToMany(targetEntity = ProductNode.class, mappedBy="parentNode")
private List<IProductNode> children = new ArrayList<>();
// needed for the use of JPA
protected ProductNode() {}
ProductNode(IProduct refProduct, IProductNode parentNode, IProductStructure ps){
Objects.requireNonNull(refProduct);
Objects.requireNonNull(ps);
this.referenceProduct = refProduct;
this.productStructure = ps;
this.parentNode = parentNode;
}
// removed getters - setters, equals() etc.
}
这是数据库数据的视图:
因此,当我得到ID = 2(根元素)的数据行时,我得到了一个包含9x(ProductNode.id = 3)的ProductNode。而且我不知道为什么,除了我希望这是由于root元素具有null作为父元素这一事实。