Neo4j OGM 中同一实体的重复实例

Duplicate instances for same entity in Neo4j OGM

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

我有一个 REST API,我的实体有 CRUD 操作,并使用 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 时,我得到了不同的结果。其余控制器中的新查找将 return 第二个实例代表解析器加载的相同实体 - 具有相同的 ID 和 UUID。似乎解析器加载的实例不在映射上下文中。这会导致保存出现问题,因为 C 引用了一个不在上下文中的实例,并且通常会导致关系被删除。

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

如何将实例从解析器获取到映射上下文中?还是我在这里做错了什么?

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

有关详细信息,请参阅 https://github.com/neo4j/neo4j-ogm/issues/881