在 Neo4J 上的关系实体中保存子类或数组列表 Spring Boot OGM
Saving a subclass or array list in relationship entity on Neo4J Spring Boot OGM
我对如何在关系实体中保存子类或 ArrayList 有疑问?
我的问题:当我将数据从存储库传递到保存调用以保存 Child 作为 Parent 的一部分时,没有问题或错误,但是当我在数据库中没有数据。
Parent Class:
@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
}
Child Class:
public class Child{
Long Id;
String name;
//Getters and Setters
}
如何实现?
看看 AttributeConverter 注释,但是,如果您需要关系上的值集合,请考虑重构您的模型,使其成为一个具有相关事物的节点。
示例:
这是一个示例属性转换器(在 Kotlin 中),它将 Neo4j 中的 to/from 字符串数组 属性 转换为 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()
}
}
根据@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 注释class。
@Convert(converter = ChildConverter.class)
Set<Child> = new HashSet<>();
我对如何在关系实体中保存子类或 ArrayList 有疑问?
我的问题:当我将数据从存储库传递到保存调用以保存 Child 作为 Parent 的一部分时,没有问题或错误,但是当我在数据库中没有数据。
Parent Class:
@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
}
Child Class:
public class Child{
Long Id;
String name;
//Getters and Setters
}
如何实现?
看看 AttributeConverter 注释,但是,如果您需要关系上的值集合,请考虑重构您的模型,使其成为一个具有相关事物的节点。
示例:
这是一个示例属性转换器(在 Kotlin 中),它将 Neo4j 中的 to/from 字符串数组 属性 转换为 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()
}
}
根据@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 注释class。
@Convert(converter = ChildConverter.class)
Set<Child> = new HashSet<>();