Spring Data Neo4j:使用枚举作为 @Node 时,findAll 失败并显示“未找到必需的属性 $enum$name”

问题描述 投票:0回答:1

我正在使用 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
    ...

该错误似乎表明类型枚举映射存在问题。

我的问题是:

  • 如何配置 Spring Data Neo4j 来正确映射枚举,例如 输入为节点?
  • 有没有具体的方法来处理枚举 使用 Spring Data 时 Neo4j 中的属性?
java spring neo4j enums
1个回答
0
投票

@Node
应该用于注释表示数据库中节点的类,每个节点都可表示为该类的单独实例。由于
enum
仅包含一组固定的常量值(并且您无法在
enum
类上创建不同的实例),因此将
enum
视为节点是没有意义的。

要修复代码,您只需从

@Node
中删除
enum
注释,并删除 @Relationship 注释即可。这将直接将
type
存储为每个
Variation 
节点的属性。而且,如有必要,您可以通过在
Variation
type
组合上创建 index 来优化查找特定
Variation
的所有
type
节点。

© www.soinside.com 2019 - 2024. All rights reserved.