2011-11-10 2 views
1

Le test ci-dessous échoue si je supprime le premier persist(). Pourquoi ai-je besoin de conserver le NodeEntity pour que le Set soit instancié? Y a-t-il une meilleure façon de faire cela? Je ne veux pas avoir à écrire dans la base de données plus souvent que nessesary.Comment persister des relations entre Neo4J NodeEntitys dans Spring Data Graph sans appeler persist deux fois

@Test 
public void testCompetenceCreation() { 
    Competence competence = new Competence(); 
    competence.setName("Testcompetence"); 
    competence.persist(); //test fails if this line is removed 
    Competence competenceFromDb = competenceRepository.findOne(competence.getId()); 

    assertEquals(competence.getName(), competenceFromDb.getName()); 

    Education education = new Education(); 
    education.setName("Bachelors Degree"); 
    competence.addEducation(education); 
    competence.persist(); 


    assertEquals(competence.getEducations(), competenceFromDb.getEducations()); 
} 

Si je supprime la ligne mentionnée, l'exception se produit ci-dessous:

Lancers

java.lang.NullPointerException 
at com.x.entity.Competence.addEducation(Competence.java:54) 

Competence.class:

@JsonIgnoreProperties({"nodeId", "persistentState", "entityState"}) 
@NodeEntity 
public class Competence { 

    @RelatedTo(type = "EDUCATION", elementClass = Education.class) 
    private Set<Education> educations; 

    public Set<Education> getEducations() { 
     return educations; 
    } 

    public void addEducation(Education education) { 
     this.educations.add(education); 
    } 
} 

Education.class

@JsonIgnoreProperties({"nodeId", "persistentState", "entityState"}) 
@NodeEntity 
public class Education { 

    @GraphId 
    private Long id; 

    @JsonBackReference 
    @RelatedTo(type = "COMPETENCE", elementClass = Competence.class, direction = Direction.INCOMING) 
    private Competence competence; 

    @Indexed 
    private String name; 

    public Long getId() { 
     return id; 
    } 

    public String getName() { 
     return name; 
    } 

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

Répondre

1

Quelle version de SDN utilisez-vous? Parce que jusqu'à la première persistance l'entité est détachée et AJ ne s'occupe pas des champs (comme la création de l'ensemble géré)

Persist crée le noeud à la connexion à l'entité, à partir de ce moment jusqu'à ce que la transaction valide que votre entité soit attachée et que toutes les modifications soient écrites.

Il n'écrit que sur la base de données lors de la validation, donc pas d'inquiétudes sur trop d'écritures. Tous les autres changements seront simplement gardés en mémoire pour votre transaction. Vous devriez probablement aussi annoter la méthode de test avec @Transactional.

Pouvez-vous créer un numéro JIRA pour cela? Alors qu'une manipulation cohérente est fournie. (Problème étant que probablement se plaint également lorsque vous initialisez l'ensemble vous-même.)

Deux autres:

  • que votre relation entre l'éducation < --Competence est probablement le même et devrait juste être dans le naviguèrent autre direction, vous devez fournir le même nomtype dans l'annotation.
  • par exemple. Education < - [: FOURNIT] -Competence

  • également si vous n'appelez pas persistez votre entité ne sera pas créé, puis le findOne en retournant null

+0

Merci pour votre réponse rapide Michael. Je comprends maintenant comment j'ai besoin d'utiliser persist, et vous étiez également sur votre note sur le type de relation dans l'annotation. Pourriez-vous expliquer ce que vous voulez que j'écrive dans le Jira? Depuis que je le comprends, ce n'est pas un bug mais plutôt que je n'ai pas une compréhension complète de la façon dont fonctionne Spring Data Graph :-) –

+0

Il suffit de créer le problème et de le lier à cette discussion. Comme description ajouter - initialiser les champs de collection de manière cohérente. Merci –

+0

Fait! Encore une fois, merci pour votre aide, très appréciée. https://jira.springsource.org/browse/DATAGRAPH-135 –

Questions connexes