超类中的通用关系
Generic relations in superclass
我正在使用 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 个城市。
现在我在新会话中加载国家/地区。结果是 1 个国家和 1 个地区。但是该地区不包含城市但包含国家/地区:
Country -> Region -> Country
如何持久化此类通用对象图?
您还需要用 @Relationship
为 containsNode
注释 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 并使用它。在 setter 上使用 @Relationship 表示这应该仅用于 OUTGOING 并且对象比映射正确。
我正在使用 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 个城市。
现在我在新会话中加载国家/地区。结果是 1 个国家和 1 个地区。但是该地区不包含城市但包含国家/地区:
Country -> Region -> Country
如何持久化此类通用对象图?
您还需要用 @Relationship
为 containsNode
注释 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 并使用它。在 setter 上使用 @Relationship 表示这应该仅用于 OUTGOING 并且对象比映射正确。