Spring-Data-Neo4J ::如何在关系中保存数组或枚举?

时间:2015-05-28 16:28:33

标签: java neo4j spring-data spring-data-neo4j-4

在下面的SELECT 'ALTER SCHEMA NewSchemaName TRANSFER [' + SysSchemas.Name + '].[' + DbObjects.Name + '];' + CHAR(13)+ CHAR(10)+ 'GO '+ CHAR(13)+ CHAR(10) FROM sys.Objects DbObjects INNER JOIN sys.Schemas SysSchemas ON DbObjects.schema_id = SysSchemas.schema_id WHERE SysSchemas.Name = 'OldSchemaName' AND (DbObjects.Type IN ('U', 'P', 'V')) 中,您可以看到我有@RelationshipEntity(一组权利)。 Set<Right> rightsRight。 Neo4J只允许我保存一组Emum,以便我自定义转换器。

String

这对我来说都很有意义,但是当我运行应用程序时,我的@RelationshipEntity (type="LOGIN") public class Login { @GraphId Long id; @StartNode Person person; @EndNode Organisation organisation; @Property String role; @Property @Convert(RightConverter.class) Set<Right> rights = new HashSet<Right>(); public Login() { // Empty Constructor } /* Getters and Setters */ } 课程出错了。

RightConverter

它适用于保存,但不适用于加载:

public class RightConverter implements AttributeConverter<Set<Right>, Set<String>> {
    public Set<String> toGraphProperty(Set<Right>  rights) {
        Set<String> result = new HashSet<>();
        for (Right right : rights) {
            result.add(right.name());
        }
        return result;
    }

    public Set<Right> toEntityAttribute(Set<String> rights) {
        Set<Right> result = new HashSet<>();
        for (String right : rights) {
            result.add(Right.valueOf(right));
        }
        return result;
    }
}

1 个答案:

答案 0 :(得分:2)

如果您正在使用SDN 4的最新快照(即发布M1版本),则无需为集合或枚举数组编写转换器。默认的枚举转换器会将枚举集转换为String数组。

但是,如果您使用的是早期版本(M1),则此支持不存在,因此您需要编写转换器。在这种情况下,RightConverter只需要更改为转换为字符串数组,这是Neo4j最终将使用的,而不是集合。这有效:

public class RightConverter implements AttributeConverter<Set<Right>, String[]> {
    public String[] toGraphProperty(Set<Right>  rights) {
        String[] result = new String[rights.size()];
        int i = 0;
        for (Right right : rights) {
            result[i++] = right.name();
        }
        return result;
    }

    public Set<Right> toEntityAttribute(String[] rights) {
        Set<Right> result = new HashSet<>();
        for (String right : rights) {
            result.add(Right.valueOf(right));
        }
        return result;
    }
}