我在从 Spring Boot 2.0.8 升级到 2.3.11 / Spring Data Neo4j 5.0.13 到 5.3.9 时遇到问题。
我有一个带有 CRUD 操作的 REST API 用于我的实体,并使用 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
. 如果我在资源中执行特定findById
的 for B
,我会得到与解析器相同的实例——这正是我想要的。
现在,当升级到 Spring Data 5.3.9 时,我得到了不同的结果。休息控制器中的新查找将返回第二个实例,该实例表示解析器加载的同一实体 - 具有相同的 ID 和 UUID。似乎解析器加载的实例不在映射上下文中。这会导致保存问题,因为C
引用了不在上下文中的实例,并且通常会导致关系被删除。
具体来说,B
解析器加载的实例有一个实例A
,但未A
完全加载(列表B
仅包含一个实例,其他实例未加载)。在 rest 控制器中查找A
将返回一个实例,其中完全加载了B
. C
使用来自解析器的引用保存新的将导致之间的B
关系被删除。A
B
如何将解析器中的实例放入映射上下文?还是我在这里做一些根本错误的事情?
该问题已通过显式设置spring.data.neo4j.open-in-view: true
in解决application.yaml
,因为默认值已更改。