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;
}
}