2011-10-03 65 views
1

我正在調查Neo4j和有關對象渴望/延遲加載的問題。可以說,我有班級手推車Set<Item>(與getters/setters)。如果我做到以下幾點:Neo4j渴望/延遲加載春天的數據

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

我後來發現基礎上,NODEID小車:

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

當我做這樣的事情:

trolley.getItems().size() 

這是空的。我想這是預期的行爲。是否有任何類似於JPA的機制,其中session/tx是否打開以動態加載集合。

代碼:

@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

f也是NodeEntity?您可能需要先堅持一個。通常它應該通過級聯向前工作,但這可能是一個角落。 你可以顯示Trolley和「f」的類定義嗎? 謝謝 –

+0

f的確是NodeEntity。我試圖堅持這一點,但最終的結果是一樣的。即f.persist()然後添加到集合中。我想我可以試試@RelationshipEntity?我將粘貼定義和一個簡單的測試。 – imamc

+2

嗨邁克爾,我認爲你是對的,修復是先堅持然後再加入收藏。我預料會發生級聯以識別添加的元素具有適當的元數據以顯示它也是節點。上面顯示了工作測試,沒有對Item item = new Item(「item1」)進行持久化。persist();將導致測試失敗。 – imamc

回答

0

據我所知,在Spring數據JPA,來填充你需要簽註調用該方法的懶加載領域的findOne(xxx)

@Transactional 

(org.springframework.transaction.annotation.Transactional)

也許它也適用於neo4j ...

我並不是真正熟練的Spring Data開發人員,但這是我知道檢索延遲加載字段的唯一方法。如果有人有更好的解決方案,隨時寫!