嗨,所有使用 Spring 数据图的耐心开发人员。由于文档太少且测试覆盖率很低,因此有时很难理解底层框架的预期行为是什么,框架应该如何工作。目前我有一些与 SDG 1.1 中引入的新获取方法相关的问题。与 SDG 1.1 write\read through in 2.0 相反,只有关系和用 @Fetch 注释注释的相关对象被急切地获取,其他人应该被懒惰地获取……现在我的第一个问题是:
对惰性关系调用 getter 发生在同一个事务中,
请求的集合是自动获取的?一种坚持
事务范围内的上下文,或者可能是为该功能计划的
发布。
Group groupFromDb = neoTemplate.findOne(group.getId(), Group.class);
assertNotNull(groupFromDb);
assertEquals("Number of members must be equals to 1", 1, groupFromDb.getMembers().size());
User secondMember = UserMappingTest.createUser("secondMember");
groupFromDb.addMember(secondMember);
neoTemplate.save(groupFromDb);
Group groupAfterChange = neoTemplate.findOne(groupFromDb.getId(), Group.class);
assertNotNull(groupAfterChange);
assertEquals("Number of members must be equals to saved entity", groupFromDb.getMembers().size(), groupAfterChange.getMembers().size());
assertEquals("Number of members must be equals to 2", 2, groupAfterChange.getMembers().size());
此测试有时会在最后一个断言上失败,这意味着有时将成员添加到集合中,有时则不会。我猜问题出在 ManagedFieldAccessorSet 的某个地方,但很难说,因为这是不确定的。我用 mvn2 和 mvn3 用 java 1.6_22 和 1.6_27 运行测试,我总是得到相同的结果:有时是好的,有时测试失败。 User equals 的实现如下所示:
@Override
public boolean equals(final Object other) {
if ( !(other instanceof User) ) {
return false;
}
User castOther = (User) other;
if(castOther.getId() == this.getId()) {
return true;
}
return new EqualsBuilder().append(username, castOther.username).isEquals();
}
- 我发现使用 @Fetch java HashSet 注释的对象也有点问题,它是可序列化的,而对于延迟加载的字段使用 ManagedFieldAccessorSet ,它是不可序列化的并导致不可序列化的异常。
欢迎任何帮助或建议。提前致谢!
请您参考如下方法:
我整理了一个快速代码示例,展示了如何使用 Michael 描述的 fetch() 技术:
http://springinpractice.com/2011/12/28/initializing-lazy-loaded-collections-with-spring-data-neo4j/




