您好所有使用弹簧数据图的患者开发人员。由于文档太少而且测试覆盖率很低,有时很难理解底层框架的预期行为是什么,框架应该如何工作。目前我有一些与 SDG 1.1 中引入的新获取方法有关的问题。与 SDG 1.1 在 2.0 中写入\读取相反,只有用 @Fetch 注释注释的关系和相关对象被急切地获取,其他人应该被懒惰地获取..现在我的第一个问题:
- 是否可以配置 SDG,以便如果实体的加载和在惰性关系上调用 getter 发生在同一个事务中,请求的集合会自动获取?事务范围内的持久性上下文类型,或者可能计划用于功能发布。
- 如何为 @RelatedTo 注释一次获取惰性集合?Neo4jOperation 的 fetch() 方法只允许获取一个实体。我是否必须遍历整个列表并为每个对象获取实体?检查给定对象是否已获取/初始化的最佳方法是什么?
- 作为建议,我认为如果在使用未初始化的对象时会抛出某种延迟加载异常而不是获取 NPE,那会更直观。此外,该行为具有误导性,因为当对象未初始化并且除 id 之外的所有成员属性均为 null 时,equals 方法可以为尚未初始化的不同对象提供 true,考虑到例如集合的应用,这是一个非常严重的问题
我在使用 SDG 2.0.0.RC1 时注意到的另一个问题如下:当我将新对象添加到未获取的集合时,有时会正确添加并保留,但有时不会。我为这种情况编写了测试,它以非确定性的方式工作。有时失败有时以成功告终。这是用例:
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,它是不可序列化的并导致不可序列化异常。
欢迎任何帮助或建议。提前致谢!