2016-10-27 4 views
1

Mon but est de persister un arbre sur un magasin MongoDB en utilisant Hibernate OGM (4.1.1 Final) avec des annotations JPA. J'ai écrit deux classes appelées Node et NodeLink: la première définit les nœuds tandis que la seconde les liens entre eux.Persister un arbre avec Hibernate OGM et MongoDB, les collections qui représentent l'arbre sont incorrectes

la classe 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; 
} 

}

la classe 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); 
} 

}

Le code qui crée les classes et persistent eux est comme suit:

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.

Comme on peut le voir sur l'image, le nœud « racine » persistée correctement, avec les références correctes aux enfants. Au lieu de cela, les nœuds «children1» et «children2» ont chacun une référence à un objet NodeLink, même si l'objet d'origine n'en possède pas. Donc ma question est: ce comportement est dû à un bug dans Hibernate OGM ou MongoDB? Sinon, il y a une erreur dans mon code?

+0

Oui, cela semble être un bug. J'investis – Davide

+0

Merci pour votre travail. –

Répondre

1

Je pense que vous avez trouvé un bug. J'ai créé un problème et envoyé une demande d'extraction: https://hibernate.atlassian.net/browse/OGM-1198

Vous pouvez essayer de tester la demande d'extraction ou attendre la prochaine version. Merci

+0

Merci, je vais essayer bientôt dans les prochains jours –

+0

Nous venons de publier 5.0.3.Final, il contiendra le correctif pour ce problème – Davide

+0

Merci Simone, j'ai mentionné votre contribution ici: http: //in.relation .to/2016/11/08/hibernate-ogm-avec-hotrod-support/ – Sanne