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



在我的@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;
    }
}

可用于save,但不能用于load:

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]

如果您正在使用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;
    }
}

相关内容

  • 没有找到相关文章

最新更新