У меня проблемы с 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). И я понятия не имею, почему, кроме того, что я ожидаю, что это происходит из-за того, что корневой элемент имеет нулевое значение в качестве родителя.