有 Java 编程相关的问题?

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

超类中的java泛型关系

我使用Spring数据Neo4j将Java实体写入Neo4j数据库。对象模型相当通用:

public abstract class AbstractNode {
     @GraphId
     private Long id;

     @Index(primary = true, unique = true)
     private String uuid;

     @Relationship(type = "CONTAINS")
     private Set<AbstractNode> containsNode;

     ...
}

@NodeEntity
public class Country extends AbstractNode { ... }

@NodeEntity
public class Region extends AbstractNode { ... }

@NodeEntity
public class City extends AbstractNode { ... }

我正在创建一个国家。在这个国家,我放了一个地区,在这个地区,我放了一个城市。之后,我调用Neo4jRepository.save(country)(当然,在我自己的接口上继承自Neo4jRepository),以使整个图形持久化:

Country -> Region -> City

在Neo4j Embedded的日志中,我可以看到1个国家、1个地区和1个城市被保留下来

现在,我在一次新的会议中向全国发表讲话。结果是1个国家和1个地区。但该地区不包括一座城市,而是一个国家:

Country -> Region -> Country

如何持久化此类通用对象图


共 (1) 个答案

  1. # 1 楼答案

    您还需要为containsNode的setter添加@Relationship注释:

    // direction defaults to OUTGOING, using it here just for clarity
    @Relationship(type = "CONTAINS", direction = "OUTGOING") 
    public void setContainsNode(Set<AbstractNode> containsNode) {
        this.containsNode = containsNode;
    }
    

    当您不执行此操作时,OGM/SDN会尝试从country匹配region上传入的CONTAINS关系,并找到匹配类型的setter并使用它。在setter上使用@Relationship表示,这应该只用于传出,而不是正确映射对象