Почему ассоциация JPA коллекции не заполняется для элемента Node? - PullRequest
0 голосов
/ 06 ноября 2018

У меня проблемы с JPA (спящий режим) и ассоциацией между коллекцией / списком. То, что я в основном имею, это объект, который похож на элемент DOM в том смысле, что он имеет коллекцию / список дочерних элементов и ссылку на корневой элемент 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, я понятия не имею, как «исправить» это поведение! Пожалуйста, кто-нибудь может указать мне правильное направление.

вот мой код: Это объект "ДОМ-ЭЛЕМЕНТ" </p> <pre><code>@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. }

и вот вид на DB-данные:

id  parentNode_id   productStructure_id referenceProduct_id
1   NULL    NULL    NULL
2   NULL    2   96
3   2   2   127
4   3   2   98
5   4   2   335
6   5   2   336
7   5   2   337
8   4   2   248
9   8   2   249
10  8   2   250
11  4   2   255
12  11  2   256
13  4   2   976
14  13  2   977
15  4   2   982
16  15  2   983
17  15  2   984
18  4   2   982
19  18  2   983
20  18  2   984
21  3   2   99
22  3   2   100

Итак, когда я получаю данные с ID = 2 (корневой элемент), я получаю ProductNode, который содержит 9x (ProductNode.id = 3). И я понятия не имею, почему, кроме того, что я ожидаю, что это происходит из-за того, что корневой элемент имеет нулевое значение в качестве родителя.

...