【问题标题】:Avoid implicit eager-loading of collections stubs?避免隐式急切加载集合存根?
【发布时间】:2013-08-26 02:52:53
【问题描述】:

我正在使用 Spring-data 通过 REST 访问 Neo4j 数据库。

我的一个实体看起来类似于以下实体:

@NodeEntity
@TypeAlias("org.example.Foo")
public class Foo {
   @GraphId
   private Long nodeId;

   //...

   @RelatedTo(type="HAS_BAR", direction=Direction.OUTGOING)
   private Set<Bar> bars; 

   //...
}

一个典型的Foo 可能有0-1000 Bars。大多数时候,加载Foo 时不需要那些Bars,所以我认为我应该通过不添加@Fetch 注释来避免急切加载Bars。

但是,当现在使用生成的存储库方法加载 Foo 时,Bars 已加载 - 至少部分加载(仅它们的 nodeId 属性)。

有什么办法可以避免这种情况吗?这种行为对性能的影响很大。
我真的希望能够对集合本身使用 https://stackoverflow.com/a/16159051/232175 中所示的延迟加载。

【问题讨论】:

    标签: java rest neo4j lazy-loading spring-data-neo4j


    【解决方案1】:

    为了使延迟获取工作,spring data 为所有Bar 创建了一个代理,其中包含足够的信息(节点 ID),可用于在需要时延迟获取 Bar。这就是在您的情况下创建Bar 的原因。我建议您使用Neo4jTemplate 仅提取您正在寻找的 Foo 的属性,如下所示

    Result<Map<String, Object>> result = template.query("START n=node({0}) RETURN n.property1, n.property2, n.property3");
    result.handle(new Handler<Map<String, Object>>()
    {
        @Override
        public void handle(Map<String, Object> row)
        {
            System.err.println(row.get("n.property1"));
            System.err.println(row.get("n.property2"));
            System.err.println(row.get("n.property3"));
        }
    });
    

    【讨论】:

    • 感谢您的回复!嗯 - 那么停止使用 spring-data 并以“旧”手动方式进行映射不会有太大区别,不是吗?
    【解决方案2】:

    如果您没有任何特殊理由通过 rest 使用 neo4j,您可以使用嵌入不存在此问题的 aspectj 映射的它。您也可以通过 REST 使用它,但根据这篇文章 Neo4j Spring data POC for social RESTful layer 最好避免使用它。

    【讨论】:

    • 谢谢,但是数据库需要被多个应用程序共享,所以这种情况下REST是必须的。
    【解决方案3】:

    如果您大部分时间都不需要 Bars,请将它们从您的实体中删除,然后在需要时使用密码加载它们?

    除此之外,spring-data-neo4j 不支持简单模式下的显式延迟加载,但你可以试试高级映射模式(http://static.springsource.org/spring-data/data-graph/snapshot-site/reference/html/#reference:aspectj)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-02
      • 2013-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-06
      • 1970-01-01
      相关资源
      最近更新 更多