【问题标题】:Fetch annotation in SDG 2.0, fetching strategy questions在 SDG 2.0 中获取注释,获取策略问题
【发布时间】:2011-11-21 21:36:01
【问题描述】:

您好所有使用弹簧数据图的患者开发人员。由于文档太少而且测试覆盖率很低,有时很难理解底层框架的预期行为是什么,框架应该如何工作。目前我有一些与 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,它是不可序列化的并导致不可序列化的异常。

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

【问题讨论】:

    标签: spring nosql neo4j spring-data-graph


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      简单的映射方式只添加到 Spring Data Neo4j 2.0 中,因此不如高级的 AspectJ 映射成熟。我们目前正在更广泛地处理documenting

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

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

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

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

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

      【讨论】:

      • 嗨,Michael 非常感谢您的反馈。很高兴知道项目的当前状态。就目前而言,由于该项目处于非常早期的阶段,因此这些问题对我们来说并不那么重要——我们可以设置“临时”关系以急切地获取,然后它就可以毫无问题地工作。提示 Long 是正确的,但是在将其更改为 equals 后没有帮助。我们注意到,当我们不使用“业务”equals 实现时,我们只使用 ids 并且当 ids 不等于时返回等于 false,然后将新元素添加到集合中。干杯马尔辛
      • 很高兴知道。该项目实际上已经一年了。只有简单的映射是新的。请继续提供如此好的反馈。在“业务”-equals 中,您是否可以检查任何一个用户名是否为空?您也可以在#neo4j 邮件列表中询问。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-08
      • 2021-08-26
      • 1970-01-01
      • 2018-04-20
      • 2012-07-03
      相关资源
      最近更新 更多