Сохранение дерева с Hibernate OGM и MongoDB, коллекции, представляющие дерево, неверны

Моя цель — сохранить дерево в хранилище MongoDB, используя Hibernate OGM (4.1.1 Final) с аннотациями JPA. Я написал два класса с именами Node и NodeLink: первый определяет узлы, а второй — связи между ними.

класс узла:

@Entity
public class Node {

private Set<NodeLink> children;

private String id;
private String name;

public Node() {
    children = new HashSet<>();
}

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Type(type = "objectid")
public String getId() {
    return id;
}
public void setId(String id) {
    this.id = id;
}

public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}

@OneToMany( mappedBy="source" )
public Set<NodeLink> getChildren() {
    return children;
}
void setChildren(Set<NodeLink> children) {
    this.children = children;
}

}

класс NodeLink:

@Entity
public class NodeLink {

private String id;

private Node source;
private Node target;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Type(type = "objectid")
public String getId() {
    return id;
}
public void setId(String id) {
    this.id = id;
}

@ManyToOne
public Node getSource() {
    return source;
}
void setSource(Node source) {
    this.source = source;
}
public void assignSource(Node source) {
    setSource(source);
    source.getChildren().add(this);
}

@ManyToOne
public Node getTarget() {
    return target;
}
void setTarget(Node target) {
    this.target = target;
}
public void assignTarget(Node target) {
    setTarget(target);
}

}

Код, который создает классы и сохраняет их, выглядит следующим образом:

    EntityTransaction transaction1 = manager.getTransaction();
    transaction1.begin();

    Node root = new Node();
    root.setName("root");
    Node children1 = new Node();
    children1.setName("children1");
    Node children2 = new Node();
    children2.setName("children2");

    NodeLink nl1 = new NodeLink();
    nl1.assignSource(root);
    nl1.assignTarget(children1);

    NodeLink nl2 = new NodeLink();
    nl2.assignSource(root);
    nl2.assignTarget(children2);

    manager.persist(root);
    manager.persist(children1);
    manager.persist(children2);
    manager.persist(nl1);
    manager.persist(nl2);

    transaction1.commit();

В MongoDB сохраняется следующее.

Как видно на изображении, «корневой» узел сохраняется правильно с правильными ссылками на дочерние элементы. Вместо этого узлы «child1» и «children2» имеют по одной ссылке на объект NodeLink, даже если в исходном объекте их нет. Итак, мой вопрос: такое поведение связано с ошибкой в ​​Hibernate OGM или MongoDB? Иначе есть ошибка в моем коде?


person Simone Manetti    schedule 27.10.2016    source источник
comment
Да, похоже баг. я инвестирую   -  person Davide    schedule 28.10.2016
comment
Спасибо за вашу работу.   -  person Simone Manetti    schedule 29.10.2016


Ответы (1)


Я думаю, вы нашли ошибку. Я создал задачу и отправил запрос на вытягивание: https://hibernate.atlassian.net/browse/OGM-1198

Вы можете попробовать протестировать запрос на вытягивание или дождаться следующего релиза. Спасибо

person Davide    schedule 31.10.2016
comment
Спасибо, попробую на днях - person Simone Manetti; 03.11.2016
comment
Мы только что выпустили 5.0.3.Final, он будет содержать исправление этой проблемы. - person Davide; 08.11.2016
comment
Спасибо, Симона, я упомянул ваш вклад здесь: in.relation.to/2016/11/08/hibernate-ogm-with-hotrod-support - person Sanne; 08.11.2016
comment
Спасибо за упоминание - person Simone Manetti; 22.11.2016