在SDG 2.0中获取注释,获取策略问题

时间:2011-11-21 21:36:01

标签: spring nosql neo4j spring-data-graph

所有患者开发人员使用弹簧数据图表。由于文档较少且测试覆盖率非常差,因此有时很难理解底层框架的预期行为,框架应该如何工作。目前我有一些与SDG 1.1中引入的新获取方法有关的问题。与SDG 1.1相反,在2.0中只读取和读取关系和用@Fetch注释注释的相关对象是急切的,其他人应该懒散地获取...现在我的第一个问题:

  • 是否可以配置SDG,以便在加载实体和时 在惰性关系上调用getter发生在同一个事务中, 请求的集合是自动获取?持久性 事务范围中的上下文,或者可能是针对该功能进行规划的 版本。
  • 如何为@RelatedTo注释一次获取延迟集合?来自Neo4jOperation的fetch()方法允许仅获取一个实体。我是否必须遍历整个列表并获取每个对象的实体?检查给定对象是否已被提取/初始化的最佳方法是什么?
  • 作为建议我认为如果在处理未初始化的对象时会抛出延迟加载异常而不是获取NPE,那将更直观。此外,该行为具有误导性,因为当对象未初始化且所有成员属性与id无关时,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等的实现如下:

@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,这是不可序列化的,并且导致不可序列化的异常。

欢迎任何帮助或建议。提前致谢!

2 个答案:

答案 0 :(得分:4)

我汇总了一个快速代码示例,展示了如何使用Michael描述的fetch()技术:

http://springinpractice.com/2011/12/28/initializing-lazy-loaded-collections-with-spring-data-neo4j/

答案 1 :(得分:3)

简单映射方法仅添加到Spring Data Neo4j 2.0中,因此它不像高级AspectJ映射那样成熟。我们目前正在更广泛地研究documenting

最近还添加了延迟加载选项。所以非常欢迎您的反馈。

现在SDN没有为延迟加载的对象使用代理方法。因此,(尚未)支持自动“获取访问”。这就是为什么在访问非加载字段时也没有抛出异常的原因,并且如果实体未完全加载,则无法“发现”。

在当前快照中,有template.fetch()操作可以完全加载延迟加载的对象和集合。

我们将研究HashSet与ManagedSet问题,这不是一个好的解决方案。

对于测试用例。是getId()返回一个Long对象还是long原语?在这里使用getId().equals(castOther.getId())可能是明智的,因为Number个对象不能保证引用相等。