2013-08-25 144 views
0

我有一个简单的关系(帐户) - [IdentifiedBy] - >(身份),像这样SpringData Neo4j的节点属性

@RelatedTo(type = "IDENTIFIED_BY", direction = Direction.OUTGOING) 
private Set<Identity> identities = new HashSet<Identity>(); 

定义。当我加载账户并访问其身份,所有身份被加载,但除ID之外的所有属性均为空。但是,如果我使用@Fetch注解属性,那么身份将正确加载,并具有所有属性。这是由设计还是我错过了什么?

@NodeEntity 
public class Account { 
    @GraphId Long nodeId; 

    @RelatedTo(type = "IDENTIFIED_BY", direction = Direction.OUTGOING) 
    //@Fetch 
    private Set<Identity> identities = new HashSet<Identity>(); 

    public Set<Identity> getIdentities() { 
     return identities; 
    } 

    public void setIdentities(Set<Identity> identities) { 
     this.identities = identities; 
    } 
} 

@NodeEntity 
public class Identity { 
    @GraphId Long nodeId; 

    private String identifier; 

    public String getIdentifier() { 
     return identifier; 
    } 

    public void setIdentifier(String identifier) { 
     this.identifier = identifier; 
    } 
} 

public interface AccountRepository extends GraphRepository<Account> { } 

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration({"/test-context.xml"}) 
@Transactional 
public class AccountTests { 

    @Autowired 
    protected AccountRepository accountRepository; 

    @Test 
    public void accountMustLoadItsIdentities() { 
     Account acct = accountRepository.save(new Account()); 

     Identity id = new Identity(); 
     id.setIdentifier("merlin"); 
     acct.getIdentities().add(id); 
     accountRepository.save(acct); 

     acct = accountRepository.findOne(acct.nodeId); 
     id = acct.getIdentities().iterator().next(); 
     assertEquals("merlin", id.getIdentifier()); 
    }  
} 

单元测试失败的最后一个断言,但成功,如果帐户@Fetch未注释。

+1

这是由设计。如果你想要热切地提取关系,你需要注解。如果您不想使用注释,请查看文档中的高级映射模式。 – tstorms

回答

2

而不是使用

account.getIdentities() 

你应该做类似如下的:

this.neo4jTemplate.fetch(account.getIdentities()) 

不使用@Fetch关键字不会自动启用延迟加载。为了延迟加载你的属性,使用上面绘制的Neo4jTemplate。

0

这是由设计

我们尽量避免不急于以下关系加载整个图形到内存中。如果相关实体已加载或未加载,则专用的@Fetch批注控制。 每当一个实体没有完全加载时,只有它的id被存储在。然后可以使用template.fetch()操作显式加载那些实体或实体集合。

http://static.springsource.org/spring-data/data-graph/snapshot-site/reference/html/#reference:simple-mapping

+0

我忘了提及这是简单的映射模式。在高级映射节点中,如果我正确理解属性,则会在访问时加载属性。 – PhilBa

相关问题