2011-10-03 4 views
1

J'étudie Neo4j et ai une question en ce qui concerne l'objet désireux/chargement paresseux. Disons que j'ai classe Trolley avec Set<Item> (avec getters/setters). Si je fais ce qui suit:Neo4j désireux/chargement paresseux avec des données de printemps

Trolley t = new Trolley(...); // create empty trolley 
t.addItem(f); // add one item to the trolley 
t.persist(); // persist the object 

je puis trouver plus tard le chariot sur la base nodeId:

repo.findOne(xxx); // returns the trolley successfully 

Quand je fais quelque chose comme:

trolley.getItems().size() 

c'est vide. Je suppose que c'est le comportement prévu. Existe-t-il un mécanisme similaire à JPA où la session/tx est ouverte pour charger dynamiquement la collection.

code:

@NodeEntity 
public class Trolley 
{ 
    @Indexed 
    private String name; 

    @RelatedTo 
    private Set<Item> items; 

    public Trolley(){} 

    public Trolley(String name) 
    { 
     this.name = name; 
    } 

    public void addItem(Item item) 
    { 
     this.items.add(item); 
    } 

    public Set<Item> getItems() 
    { 
     return items; 
    } 

} 

@NodeEntity 
public class Item 
{ 
    private String name; 

    public Item(){} 

    public Item(String name) 
    { 
     this.name = name; 
    } 

    public String getName() 
    { 
     return name; 
    } 
} 

@Test 
public void trolleyWithItemPersist() 
{ 
    Trolley trolley = new Trolley("trolley1").persist(); 

    // Persisting - however I would've expected a cascade to 
    // occur when adding to the collection. 
    Item item = new Item("item1").persist(); 

    // now add to the trolley 
    trolley.addItem(item); 

    // persist 
    trolley.persist(); 

    // Now use repo to get trolley 
    Trolley loadedTrolley = trolleyRepository.findOne(trolley.getNodeId()); 

    // should have one item 
    assertEquals(1, loadedTrolley.getItems().size()); 

} 
+2

Est-ce que f est aussi un NodeEntity? Il pourrait être nécessaire que vous persistiez celui-là en premier. Normalement, cela devrait fonctionner en cascade, mais cela pourrait être un casse-tête. Pouvez-vous afficher les définitions de classe de Trolley et "f"? Merci –

+0

f est en effet une NodeEntity. J'ai essayé de persister en premier, mais le résultat net est le même. c'est-à-dire f.persist() puis ajout à la collection. Je suppose que je pourrais essayer @RelationshipEntity? Je vais coller les définitions et un test simple. – imamc

+2

Salut Michael, je pense que tu avais raison, le problème était de persister d'abord puis de l'ajouter à la collection. Je m'attendais à ce qu'une cascade se produise pour reconnaître que l'élément ajouté a les méta-données appropriées pour montrer qu'il s'agit également d'un nœud. Le test de fonctionnement est montré ci-dessus, ne faisant pas la persistance sur Item item = new Item ("item1"). Persist(); provoquera l'échec du test. – imamc

Répondre

0

AFAIK, au printemps de données Jpa, pour remplir un champ chargé paresseux vous devez annoter la méthode qui appelle la findOne(xxx) avec

@Transactional 

de (org.springframework.transaction.annotation.Transactional)

Peut-être que cela fonctionne aussi avec neo4j ...

Je ne suis pas vraiment un développeur expérimenté sur Spring Data mais c'est la seule façon que je connaisse pour récupérer des champs chargés paresseux. Si quelqu'un a une meilleure solution, n'hésitez pas à l'écrire!

Questions connexes