我正在使用 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 来创建节点和关系。 VariationRepository 上的
findAll
方法失败并出现以下错误:
java.lang.IllegalStateException: Required property $enum$name not found for class org.com.example.node.Type
at org.springframework.data.mapping.PersistentEntity.getRequiredPersistentProperty
...
该错误似乎表明类型枚举映射存在问题。
我的问题是:
@Node
应该用于注释表示数据库中节点的类,每个节点都可表示为该类的单独实例。由于 enum
仅包含一组固定的常量值(并且您无法在 enum
类上创建不同的实例),因此将 enum
视为节点是没有意义的。
要修复代码,您只需从
@Node
中删除 enum
注释,并删除 @Relationship 注释即可。这将直接将 type
存储为每个 Variation
节点的属性。而且,如有必要,您可以通过在 Variation
和 type
组合上创建 index 来优化查找特定 Variation
的所有 type
节点。