spring-boot - Neo4j OGM中同一实体的重复实例
问题描述
我在从 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
,因为默认值已更改。
推荐阅读
- python - 正则表达式检查句子中是否存在特定的多个单词
- react-native - 在 iPhone 7 上 React Native 地理定位标题始终为 -1
- javascript - 创建 JSON 对象的排列?
- java - 使用 double 类型时在 Java 中转换为 Integer
- bash - Bash - 将变量分配给 yad 值 - for 循环中的 sed 用法
- python - Qt5 UI未在python应用程序中显示未选中的表格小部件单元格
- python - Python if 语句中何时需要“pass”?
- linux - 如何从 apache 模块访问响应数据?
- java - Spring Boot 2 中无法识别 MappingJackson2HttpMessageConverter 配置
- google-app-engine - Google App Engine - Mail() 附件