Neo4j OGM:使用@RelationshipEntity无法加载关联节点的问题排查
问题:Neo4j OGM调用
load方法指定depth=-1仅加载根节点,未加载关联节点 节点结构说明
对应的图结构如下:
实体映射代码
@NodeEntity data class A( @Id val id: String? = null, @Relationship(type = "HAS_B") val b: MutableSet<B> = mutableSetOf<B>() ) @RelationshipEntity(type = "HAS_B") data class HasB @JvmOverloads constructor( @Id @GeneratedValue val id: Long? = null, @StartNode val start: A = A(), @EndNode val end: B = B() ) @NodeEntity data class B( @Id val id: String? = null, @Relationship(type = "HAS_C") val c: MutableSet<C> = mutableSetOf<C>() ) ...
问题场景
调用session.load(A::class.java, "a1", -1)方法,期望加载A节点及所有关联的B、C节点,但实际仅加载了A节点。
问题原因
你在映射关系时同时使用了@RelationshipEntity定义HAS_B关系实体,但在A类的@Relationship注解中未指定关联的关系实体类。Neo4j OGM默认会将A类中的b属性识别为普通的直接节点关联,而非通过HasB这个关系实体的关联,导致深度加载逻辑无法正确识别并遍历该关系,进而无法加载后续的B、C节点。
解决方法
方法一:保留关系实体,修正映射配置
在A类的@Relationship注解中明确指定relationshipEntity参数,关联到HasB类,让OGM知晓该关系通过关系实体实现:
@NodeEntity data class A( @Id val id: String? = null, @Relationship(type = "HAS_B", relationshipEntity = HasB::class.java) val b: MutableSet<B> = mutableSetOf<B>() )
方法二:移除关系实体,使用普通节点关联
如果你的HAS_B关系不需要存储额外属性,完全可以去掉HasB这个关系实体类,直接使用普通的节点关联映射:
@NodeEntity data class A( @Id val id: String? = null, @Relationship(type = "HAS_B") val b: MutableSet<B> = mutableSetOf<B>() ) @NodeEntity data class B( @Id val id: String? = null, @Relationship(type = "HAS_C") val c: MutableSet<C> = mutableSetOf<C>() )
两种方法都能让OGM在depth=-1时正确遍历所有关联节点,加载A及下属的B、C节点。
内容的提问来源于stack exchange,提问作者ConfusedPenguin
相关产品推荐
相关产品推荐

