【问题标题】:Spring-Data-Neo4J :: How do I save an array or enums in a relationship?Spring-Data-Neo4J :: 如何在关系中保存数组或枚举?
【发布时间】:2015-08-11 07:04:29
【问题描述】:

在我下面的@RelationshipEntity 中,您可以看到我有一个Set<Right> rights(一组权限)。 RightEmum。 Neo4J 只允许我保存一组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;
    }
}

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

nested exception is org.neo4j.ogm.metadata.MappingException: Error mapping GraphModel to instance of com.noxgroup.nitro.domain.Person
Caused by: java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Set
at com.noxgroup.nitro.domain.converters.RightConverter.toEntityAttribute(RightConverter.java:9) ~[main/:na]

【问题讨论】:

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


    【解决方案1】:

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

    但是,如果您使用的是早期版本 (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;
        }
    }
    

    【讨论】:

    • 我有(我认为)最新的快照版本(如何检查),但它仍然不适合我。
    • 知道RC1什么时候出吗?
    • 如果你有 org.springframework.data:spring-data-neo4j:jar:4.0.0.BUILD-SNAPSHOT 那么你正在使用快照。 RC1-目前我能说的最好的就是“很快”
    • 是默认转换器不起作用还是您自己的转换器?如果您已切换到默认值并且您正在加载一个之前持久化的实体,请确保权限确实存储为节点上的字符串数组。
    • 我的转换器可以工作 100 个。默认转换器没有。我每次运行都从头开始(清除数据库)。错误是:嵌套异常是 org.neo4j.ogm.metadata.MappingException:JSON 中不允许 Map 的 Null 键(使用转换 NullKeySerializer?我现在可以使用我的转换器。只是想知道为什么默认转换器不是'不工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2017-12-08
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    相关资源
    最近更新 更多