在Neo4J Spring Boot OGM上的关系实体中保存子类或数组列表

时间:2018-10-01 10:13:38

标签: java spring-boot neo4j spring-data-neo4j neo4j-ogm

我对如何在关系实体中保存子类或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
}

我该如何实现?

2 个答案:

答案 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<>();