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 ObjectIdResolver
s 从传入的 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
将导致删除 A
和 B
之间的关系。
如何将实例从解析器获取到映射上下文中?还是我在这里做错了什么?
问题已通过在 application.yaml
中显式设置 spring.data.neo4j.open-in-view: true
解决,因为默认设置已更改。
有关详细信息,请参阅 https://github.com/neo4j/neo4j-ogm/issues/881。
我在从 Spring Boot 2.0.8 升级到 2.3.11 / Spring Data Neo4j 5.0.13 到 5.3.9 时遇到问题。
我有一个 REST API,我的实体有 CRUD 操作,并使用 Jackson ObjectIdResolver
s 从传入的 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
将导致删除 A
和 B
之间的关系。
如何将实例从解析器获取到映射上下文中?还是我在这里做错了什么?
问题已通过在 application.yaml
中显式设置 spring.data.neo4j.open-in-view: true
解决,因为默认设置已更改。
有关详细信息,请参阅 https://github.com/neo4j/neo4j-ogm/issues/881。