我使用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
我如何坚持这样的通用对象图?
答案 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而且用于正确映射的对象。