Neo4j-OGM保存带@RelationshipEntity的@NodeEntity触发栈溢出如何解决
问题根因
该异常是Lombok生成的hashCode方法循环递归调用导致的:
Device类的hashCode计算逻辑会包含关联的deviceReadings集合的哈希值DeviceReading类使用了@Data注解,默认会把所有字段(包括@StartNode标注的device字段)纳入hashCode计算范围- 两个类的
hashCode互相触发调用,形成无限递归,最终抛出StackOverflowError
你在device字段上添加的@JsonIgnore仅对JSON序列化场景生效,不会影响Lombok生成的equals、hashCode逻辑,因此无法解决该循环问题。
修复方案
方案1:显式指定equals/hashCode仅计算主键字段
推荐在实体类上使用@EqualsAndHashCode注解,仅将业务主键/ID字段纳入判等和哈希计算,完全避免关联字段带来的循环问题:
@AllArgsConstructor @NodeEntity(label = "Device") @EqualsAndHashCode(onlyExplicitlyIncluded = true) public class Device { @Index @Id @Property(name="deviceId") @EqualsAndHashCode.Include private String id; public Device(String id) { this.id = id; } @Relationship(type = "WITH_READING") Set<DeviceReading> deviceReadings; }
@Data @AllArgsConstructor @RelationshipEntity(type = "WITH_READING") @EqualsAndHashCode(onlyExplicitlyIncluded = true) public class DeviceReading { @EqualsAndHashCode.Include private Long id; @EqualsAndHashCode.Include @Property(name = "timestamp") private long timestamp; @JsonIgnore @StartNode private Device device; @EndNode private Reading reading; }
方案2:直接排除关联字段
也可以在关联的节点字段上添加排除注解,禁止其参与equals/hashCode/toString的生成逻辑:
@Data @AllArgsConstructor @RelationshipEntity(type = "WITH_READING") public class DeviceReading { private Long id; @Property(name = "timestamp") private long timestamp; @JsonIgnore @StartNode @EqualsAndHashCode.Exclude @ToString.Exclude private Device device; @EndNode @EqualsAndHashCode.Exclude @ToString.Exclude private Reading reading; }
注意事项
Neo4j OGM实体不推荐直接使用@Data注解,该注解默认生成的toString、equals、hashCode很容易因关联字段触发循环调用,建议所有关联的节点、关系字段都从equals和hashCode的计算逻辑中排除,仅使用实体的主键字段作为判等和哈希计算的依据。
内容的提问来源于stack exchange,提问作者Sylviaa20
相关产品推荐
相关产品推荐

