超类

时间:2017-05-23 15:54:01

标签: java spring neo4j spring-data-neo4j

我使用Spring Data 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 { ... }

我创建了1个国家/地区。进入这个国家我放1个地区,在区域我放1个城市。之后,我调用Neo4jRepository.save(country)(当然是继承自Neo4jRepository的我自己的界面),使整个图表持久化:

Country -> Region -> City

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

现在我在一个新的Session中加载Country。结果是1个国家/地区。但是该地区不包含城市,而是国家:

Country -> Region -> Country

我如何坚持这样的通用对象图?

1 个答案:

答案 0 :(得分:0)

您还需要使用containsNode@Relationship添加一个setter:

// 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会尝试匹配来自国家/地区的传入CONTAINS关系,并找到匹配类型的设置者并使用它。在setter上使用@Relationship说这应该仅用于OUTGOING而且用于正确映射的对象。