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



欢迎所有使用spring数据图的患者开发人员。由于文档很少,测试覆盖率很低,因此有时很难理解底层框架的预期行为是什么,框架应该如何工作。目前,我对SDG 1.1中引入的新抓取方法有一些疑问。与SDG 1.1的writeread through相反,2.0中只有关系和带有@Fetch注释的相关对象被急切地获取,其他对象应该被惰性地获取。现在我的第一个问题:

  • 是否可以配置SDG,以便如果实体和在同一个事务中调用惰性关系的getter,请求的集合是自动获取的吗?一种坚持上下文在事务范围内,或者可能是为特性计划的版本。
  • 我怎么能一次获取@RelatedTo注释的懒惰收集?从Neo4jOperation中获取()方法只允许获取一个实体。我必须通过整个列表和获取实体为每个对象迭代吗?检查给定对象是否已经获取/初始化的最好方法是什么?
  • 作为建议,我认为这将是更直观的,如果有一种延迟加载异常抛出,而不是得到NPE工作时,没有初始化的对象。此外,当对象未初始化并且除id外所有成员属性都为null时,equals方法可以为未初始化的不同对象提供true,这是相当严重的问题,例如考虑到set
  • 的应用
  • 我在使用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的某个地方,但很难说,因为这是不确定的。我用java 1.6_22和1.6_27运行mvn2和mvn3测试,我总是得到相同的结果:有时是好的,有时测试失败。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是不可序列化的,并导致不可序列化的异常。

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

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

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

简单的映射方法仅添加到Spring Data Neo4j 2.0中,因此它不如高级AspectJ映射成熟。我们目前正在更广泛地编写文档。

延迟加载选项也是最近添加的。所以我们非常欢迎你的反馈。

现在SDN没有为延迟加载的对象使用代理方法。因此,自动"访问取"(fetch on access)是不支持的。这就是为什么在访问未加载字段时也不会抛出异常,并且如果实体没有完全加载,也没有办法"发现"。

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

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

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

相关内容

  • 没有找到相关文章

最新更新