2013-08-25 191 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

相關問題