Spring-Data-Neo4J:: Как сохранить массив или перечисления в отношениях?

В моем @RelationshipEntity ниже вы можете увидеть, что у меня есть Set<Right> rights (набор прав). Right является Emum, 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]

1 ответ

Если вы используете последний моментальный снимок 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;
    }
}
Другие вопросы по тегам