【问题标题】:Duplicate instances for same entity in Neo4j OGMNeo4j OGM中同一实体的重复实例
【发布时间】:2021-08-31 08:46:32
【问题描述】:

我在从 Spring Boot 2.0.8 升级到 2.3.11/Spring Data Neo4j 5.0.13 到 5.3.9 时遇到问题。

我有一个对我的实体进行 CRUD 操作的 REST API,并使用 Jackson ObjectIdResolvers 从传入 JSON 请求中的 id 解析相关实体。实体具有 UUID 类型的自定义 id 字段,解析器使用 Neo4j 存储库通过 UUID 键查找实体。

在我的例子中,有 3 个实体是相关的:

(A)--(B)--(C)

A 有一个B 的列表,B 有一个C 的列表。 POST创建一个新的C

{
  "name": "My C",
  "b": "c3c9ec23-ff05-4295-9b5b-209af08328ac"
}

B 的解析器将查找实体并填充我的 C 实例。如果我在资源中为B 执行特定的findById,我会得到与解析器相同的实例——这正是我想要的。

现在,当升级到 Spring Data 5.3.9 时,我得到了不同的结果。休息控制器中的新查找将返回第二个实例,该实例表示解析器加载的同一实体 - 具有相同的 ID 和 UUID。似乎解析器加载的实例不在映射上下文中。这会导致保存问题,因为C 引用了不在上下文中的实例,并且通常会导致关系被删除。

具体来说,解析器加载的实例B有一个A的实例,但是A没有完全加载(B的列表只包含一个实例,其他的都没有加载)。在 rest 控制器中查找 A 将返回一个实例,其中完全加载了 B 列表。使用解析器中的B 引用保存新的C 将导致AB 之间的关系被删除。

如何将解析器中的实例放入映射上下文?还是我在这里做一些根本错误的事情?

【问题讨论】:

    标签: spring-boot jackson spring-data-neo4j neo4j-ogm


    【解决方案1】:

    问题已通过在application.yaml 中显式设置spring.data.neo4j.open-in-view: true 解决,因为默认值已更改。

    更多详情请见https://github.com/neo4j/neo4j-ogm/issues/881

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多