SDN 6(Spring Data Neo4j)使用@RelationshipProperties时关系无法保存问题
问题原因
导致@RelationshipProperties注解的关系无法创建的核心原因有3个:
- 关系属性类的主键使用了基本数据类型
long:基本类型默认值为0,Spring Data Neo4j 6.x会将其判定为已持久化的存量对象,不会触发新增关系的逻辑。 - 关系属性类缺少无参构造函数:你仅自定义了带参构造函数,Java不会自动生成无参构造,SDN在持久化阶段需要通过无参构造反射实例化对象,缺少会导致映射失败。
- 若起始节点User的
visits集合属性未提供对应的get/set方法,SDN无法读取关系集合,也会导致关系创建失败。
解决方案
按照以下步骤修改即可:
- 调整
Visits关系属性类的代码,将主键改为包装类型、补充无参构造:
@RelationshipProperties public class Visits { @Id @GeneratedValue private Long id; // 替换基本类型long为包装类型Long @Property private String description; @TargetNode private PointOfInterest poi; // 新增无参构造函数 public Visits() { } public Visits(String description, PointOfInterest p){ this.description = description; this.poi = p; } // 确保所有属性都已实现getter、setter方法 // ... 原有getter setter逻辑 }
- 校验起始节点User的配置:
- 确认User类已添加
@Node注解 - 确认
visits集合属性已实现对应的getter、setter方法
- 确认User类已添加
- (可选)开启Cypher日志排查问题:如果修改后仍然无法创建关系,可以在application.properties中添加如下配置,打印执行的Cypher语句排查逻辑问题:
logging.level.org.springframework.data.neo4j.cypher=DEBUG
内容的提问来源于stack exchange,提问作者Emmanuel janssens
相关产品推荐
相关产品推荐

