我对如何在关系实体中保存子类或ArrayList有疑问?
我的问题:当我将数据从存储库传递到save调用以将Child作为Parent的一部分保存时,没有问题或错误,但是当我在数据库中进行检索或查找时,没有数据。
父类:
@RelationshipEntity(type = "HAS_DATA")
public class Parent{
private Long id;
private Long sequenceId;
Set<Child> = new HashSet<>();
@StartNode
SomeClass1 someClass1;
@EndNode
SomeClass2 someClass2;
//Getter and Setters
}
儿童班:
public class Child{
Long Id;
String name;
//Getters and Setters
}
我该如何实现?
答案 0 :(得分:1)
看看AttributeConverter批注,但是,如果您需要一个关系值集合,请考虑重构模型,使其成为具有相关内容的节点。
示例:
这里是一个示例属性转换器(在Kotlin中),该转换器将Neo4j中的字符串数组属性转换为Java类型。
class RoleArrayAttributeConverter : AttributeConverter<Array<Role>, Array<String>>
{
override fun toEntityAttribute(value: Array<String>): Array<Role>
{
return value.map { Role.valueOf(it) }.toTypedArray()
}
override fun toGraphProperty(value: Array<Role>): Array<String>
{
return value.map { it.toString() }.toTypedArray()
}
}
答案 1 :(得分:1)
按照@Jasper Blues的建议,我用Java创建了自己的转换器。回答我自己的问题,因为我无法在注释中添加它。
public class ChildConverter implements AttributeConverter<Set<Child>, String> {
ObjectMapper mapper = new ObjectMapper();
@Override
public String toGraphProperty(Set<Child> data) {
String value = "";
try {
value = mapper.writeValueAsString(data);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return value;
}
@Override
public Set<Child> toEntityAttribute(String data) {
Set<Child> mapValue = new HashSet<Child>();
TypeReference<Set<Child>> typeRef = new TypeReference<Set<Child>>() {
};
try {
mapValue = mapper.readValue(data, typeRef);
} catch (IOException e) {
e.printStackTrace();
}
return mapValue;
}
}
确保在父类中添加@Convert注释。
@Convert(converter = ChildConverter.class)
Set<Child> = new HashSet<>();