1

私の目標は、Hibernate OGM (4.1.1 Final) と JPA アノテーションを使用して、ストア MongoDB にツリーを永続化することです。Node と NodeLink という 2 つのクラスを作成しました。1 つ目はノードを定義し、2 つ目はノード間のリンクを定義します。

ノードクラス:

@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 に永続化されているのはこれです。

画像に見られるように、「ルート」ノードは、子への正しい参照を使用して正しく永続化されています。代わりに、元のオブジェクトに NodeLink オブジェクトがない場合でも、「children1」ノードと「children2」ノードはそれぞれ NodeLink オブジェクトへの参照を 1 つ持ちます。私の質問は次のとおりです。この動作は、Hibernate OGM または MongoDB のバグによるものですか? それ以外の場合、コードにエラーがありますか?

4

1 に答える 1

1

バグを発見したと思います。問題を作成し、プル リクエストを送信しました: https://hibernate.atlassian.net/browse/OGM-1198

プル リクエストをテストするか、次のリリースまで待つことができます。ありがとう

于 2016-10-31T10:26:46.403 に答える