我有一个简单的关系(帐户) - [IdentifiedBy] - >(身份),定义如下
@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,则成功。
答案 0 :(得分:2)
而不是使用
account.getIdentities()
您应该执行以下操作:
this.neo4jTemplate.fetch(account.getIdentities())
不使用@Fetch关键字不会自动启用延迟加载。要延迟加载属性,请使用上面绘制的Neo4jTemplate。
答案 1 :(得分:0)
这是设计
我们试图避免通过不热切地关注关系将整个图形加载到内存中。如果加载了相关实体,则专用的@Fetch批注控制。 每当实体未完全加载时,只存储其ID 。然后可以使用template.fetch()操作显式加载这些实体或实体集合。