2016-10-27 7 views
1

私の目標は、JPAアノテーションでHibernate OGM(4.1.1 Final)を使用してストアMongoDBにツリーを永続させることです。 私はNodeとNodeLinkと呼ばれる2つのクラスを書いています。最初はノードを定義し、2番目はノード間のリンクを定義します。Hibernate OGMとMongoDBでツリーを永続化すると、ツリーを表すコレクションが正しくない

Nodeクラス:

@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(); 

What is persisted in MongoDB is this.

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

+0

はい、バグのようです。私は投資している – Davide

+0

あなたの仕事に感謝します。 –

答えて

1

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

プルリクエストをテストするか、次のリリースまでお試しください。 ありがとう

+0

ありがとう、私はすぐ次の数日で試してみます –

+0

私たちは5.0.3.Finalをリリースしました。この問題の修正が含まれています – Davide

+0

ありがとうSimone、私はあなたの貢献をここに述べました:http://in.relation .to/2016/11/08/hibernate-ogm-with-hotrod-support/ – Sanne

関連する問題