2

Neo4jを調査していますが、オブジェクトの熱心な/遅延読み込みに関して質問があります。私が持っているクラストロリーを持っているとしましょうSet<Item>(ゲッター/セッター付き)。私が次のことをした場合:

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

これは空です。これが意図した動作だと思います。コレクションを動的にロードするためにsession/txが開いているJPAに似たメカニズムはありますか。

コード:

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

}
4

1 に答える 1

0

Afaik、Spring Data Jpa では、遅延ロードされたフィールドにデータを入力するには、findOne(xxx)withを呼び出すメソッドにアノテーションを付ける必要があります。

@Transactional 

から(org.springframework.transaction.annotation.Transactional)

多分それもneo4j...

私はSpring Dataの熟練した開発者ではありませんが、これが遅延ロードされたフィールドを取得する唯一の方法です。誰かがより良い解決策を持っている場合は、気軽に書いてください!

于 2011-10-04T08:18:54.583 に答える