有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我有一个关于如何在关系实体内保存子类或ArrayList的查询

我的问题:当我将数据从存储库传递到save调用以将子项保存为父项的一部分时,没有问题或错误,但是当我在数据库中检索或查找时,没有数据存在

父类:

@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) 个答案

  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<>();
    
  2. # 2 楼答案

    查看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()
        }
    
    }