Spring Data Neo4j双向定义关系报逻辑循环映射依赖错误如何解决
这个异常是Spring Data Neo4j 6.1版本新增的循环映射依赖校验触发的,目的是避免双向关联下默认全量抓取导致的无限递归、性能损耗问题,你可以通过以下两种方案解决:
方案1:配置关联属性不默认抓取
SDN 6.1+ 版本的@Relationship注解提供了fetch参数,默认值为true(派生查询时会主动抓取关联节点),你只需要将不需要默认查询的关联属性的fetch设为false即可:
@Node data class Bar( @Id override val customId: String, val name: String, @Relationship( type = "CONFIGURED_TO", direction = Relationship.Direction.OUTGOING, fetch = false // 新增此行,派生查询时不主动抓取foos集合 ) var foos: Set<Foo> = emptySet(), ) : Base()
如果查询Foo时也不需要默认加载bars集合,可以给Foo类的bars属性也加上同样的fetch = false配置。
配置完成后,查询实体时关联属性会保持默认空值,不会触发关联查询,自然不会出现循环映射异常;你需要更新关联关系时,正常给关联属性赋值后再保存实体,SDN仍会正常处理关联关系的增删,完全不影响你简化更新的需求。如果后续有场景需要同时查询关联节点,可以自定义Cypher查询加上FETCH关键字主动加载关联。
方案2:使用静态投影承接查询结果
如果连实体关联属性的默认值都不需要返回,你可以定义只包含业务所需字段的投影接口,查询时直接返回投影类型,完全不会触碰关联属性:
// 定义投影,只包含Bar需要返回的字段 interface BarProjection { val customId: String val name: String } // Repository中定义派生查询 interface BarRepository : Neo4jRepository<Bar, String> { // 返回投影类型,不会加载foos关联 fun findAllBy(): List<BarProjection> fun findByCustomId(customId: String): BarProjection? }
内容的提问来源于stack exchange,提问作者LeadingMoominExpert
相关产品推荐
相关产品推荐

