2

我正在调查 Neo4j,并且对对象急切/延迟加载有疑问。可以说我有类 Trolley Set<Item>(带有 getter/setter)。如果我执行以下操作:

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

}
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 回答