Java 从数据库加载的@NodeEntity不完整
从“Neo4j推荐”教程中,我下载并导入了产品目录数据集。我正在使用对象图映射创建一个SpringNeo4j项目 目前,我已经为Java 从数据库加载的@NodeEntity不完整,java,neo4j,spring-data-neo4j,neo4j-ogm,Java,Neo4j,Spring Data Neo4j,Neo4j Ogm,从“Neo4j推荐”教程中,我下载并导入了产品目录数据集。我正在使用对象图映射创建一个SpringNeo4j项目 目前,我已经为产品和类别创建了一个@NodeEntity。为了快速验证是否一切正常,@PostConstruct方法用于ProductService和CategoryService从数据库获取产品和类别 我注意到,如果我查询产品,然后得到产品的类别,然后类别集中的所有产品不包含所有产品,而只包含我开始查询时使用的产品 但是,如果我直接查询类别本身,它确实包含所有产品 private
产品
和类别
创建了一个@NodeEntity
。为了快速验证是否一切正常,@PostConstruct
方法用于ProductService
和CategoryService
从数据库获取产品和类别
我注意到,如果我查询产品,然后得到产品的类别,然后类别集中的所有产品不包含所有产品,而只包含我开始查询时使用的产品
但是,如果我直接查询类别本身,它确实包含所有产品
private void showInfo(final Category category) {
System.out.printf("Name:%s%n", category.getName());
System.out.printf("Parent: %s%n", category.getParent());
System.out.printf("Products:%s%n", category.getProducts());
}
图形模型如下所示:
我要查询的数据子集是:
产品
实体定义为:
@NodeEntity
public class Product {
@Id
private String sku;
private String name;
@Relationship(type = "IN_CATEGORY")
private Category category;
@Convert(PriceConverter.class)
private BigDecimal price;
}
@NodeEntity
public class Category {
@Id @GeneratedValue
private Long id;
private String name;
@Relationship(type = "PARENT_CATEGORY")
private Category parent;
@Relationship(type = "IN_CATEGORY", direction = Relationship.INCOMING)
private Set<Product> products = new HashSet<>();
}
类别
实体定义为:
@NodeEntity
public class Product {
@Id
private String sku;
private String name;
@Relationship(type = "IN_CATEGORY")
private Category category;
@Convert(PriceConverter.class)
private BigDecimal price;
}
@NodeEntity
public class Category {
@Id @GeneratedValue
private Long id;
private String name;
@Relationship(type = "PARENT_CATEGORY")
private Category parent;
@Relationship(type = "IN_CATEGORY", direction = Relationship.INCOMING)
private Set<Product> products = new HashSet<>();
}
我本以为这套产品会被懒散地评估为全套产品。我需要强迫它这样做吗?其他节点何时加载到@NodeEntity
,如何确保加载了特定节点的完整子图
编辑:
文档包含以下引用:
对于图到对象映射,相关实体的自动传递加载取决于调用Session.load()时指定的视界深度。默认深度为1表示将加载相关节点或关系实体并设置其属性,但不会填充任何相关实体
这表明应该使用会话对象加载更多数据,但我不知道是哪个会话对象。您的分析是正确的。Spring数据Neo4j(以及底层OGM)中的默认加载深度为1。当您加载产品时,您将获得其类别,但不会获得其他产品,因为这些产品在图中与原始产品相差2跳。如果您想获取所有相关产品,我可以想出两种可能的方法