java - 避免隐式急切加载集合 stub ?

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

我正在使用 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 个 Bar。大多数时候,加载 Foo 时不需要这些 Bar,所以我认为我应该不添加 @Fetch 注释,从而避免急切加载 Bar

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

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

最佳答案

为了使延迟获取发挥作用,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"));
    }
});

关于java - 避免隐式急切加载集合 stub ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18435948/

相关文章:

java - 如何在JPA中不检索 parent 信息

python - 自然语言处理 : text corpus format for word2vec

javascript - 使用 Reactjs 的 Axios Post 表单

Neo4j 关系属性 - 值数组与重复关系

java - 创建/设置来自 Neo4j 中参数对象的属性

java - 如何重置 IntelliJ IDEA 设置?

java - 使用 `Runtime.getRuntime().exec()` 获取 `top` 的输出

java - 在 Hibernate 中,两个实体如何与第三个实体具有多对多的单向关系?

java - 我怎样才能修改这个视线算法来接受穿过角落的光线?

Neo4J APOC A* 和 Dijkstra 条件