我正在使用 Spring Data Neo4j 来处理我的 Neo4j 数据库。我的应用程序包含一个与名为 Type 的枚举有关系的 Variation 节点实体。这是我的代码的简化版本:
@Node
public class Variation extends BaseEntity {
private String title;
@Relationship(type = "HAS_ATTRIBUTE", direction = Relationship.Direction.OUTGOING)
private Type type;
// Other fields and relationships...
}
@Node
public enum Type {
CUSTOM(0),
FIX(1),
// Other constants...
@Id
private final int id;
Type(int id) {
this.id = id;
}
}
这是我的build.gradle
依赖项:
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-neo4j'
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
implementation 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
}
我还使用 VariationService 创建节点和关系。VariationRepositoryfindAll
上的方法失败,并出现以下错误:
java.lang.IllegalStateException: Required property $enum$name not found for class org.com.example.node.Type
at org.springframework.data.mapping.PersistentEntity.getRequiredPersistentProperty
...
该错误似乎表明类型枚举映射存在问题。
我的问题是:
- 如何配置 Spring Data Neo4j 以将 Type 等枚举正确映射为节点?
- 使用 Spring Data 时,是否有特定的方法来处理 Neo4j 中的枚举属性?
@Node
应该用来注释表示数据库中节点的类,每个节点都可以表示为该类的一个单独实例。由于 只enum
包含一组固定的常量值(并且您不能在类上创建不同的实例),因此将 视为节点是enum
没有意义的。enum
要修复代码,您只需
@Node
从 中删除注释enum
,并同时删除 @Relationship 注释即可。这样会直接将 存储type
为每个节点的属性。并且,如有必要,您可以通过在和组合上创建索引来优化查找任何给定的Variation
所有节点。Variation
type
Variation
type