【发布时间】:2019-07-03 08:50:18
【问题描述】:
从“Neo4j 推荐”教程之一中,我下载并导入了产品目录数据集。我正在使用对象图映射创建一个 Spring Neo4j 项目。
现在我为Product 和Category 创建了一个@NodeEntity。为了快速验证是否一切正常,使用@PostConstruct 方法和ProductService 和CategoryService 从数据库中获取产品和类别。
我注意到的是,如果我查询产品,则获取产品的类别,然后该集合中的所有产品不包含所有产品,而只包含我开始查询的产品。
但是,如果我直接查询类别本身,它确实包含所有产品。
图模型如下:
Product 实体定义为:
@NodeEntity
public class Product {
@Id
private String sku;
private String name;
@Relationship(type = "IN_CATEGORY")
private Category category;
@Convert(PriceConverter.class)
private BigDecimal price;
}
Category 实体定义为:
@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<>();
}
我创建了一个Repository 类。
如果我查询CategoryRepository' withcategoryRepository.findByName("Desks")` 并打印结果,该类别有三个产品,正如预期的那样。
如果我在ProductRepository 查询“高度可调节站立式办公桌”并打印其类别信息,则它是“办公桌”类别,但它只包含一个产品(高度可调节站立式办公桌)而不包含其他两个产品.
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,您如何确定某个节点的完整子图已加载?
编辑: 该文档包含以下引用:
对于图形到对象的映射,相关实体的自动传递加载取决于调用 Session.load() 时指定的水平深度。默认深度 1 表示将加载相关节点或关系实体并设置其属性,但不会填充其相关实体。
这表明应该使用会话对象来加载更多数据,但我不知道是哪个会话对象。
【问题讨论】:
标签: java neo4j spring-data-neo4j neo4j-ogm