JPA + Hibernate:CriteriaQuery没有加载渴望的ManyToOne关系

时间:2013-10-01 08:02:50

标签: java hibernate jpa-2.0

我在使用 CriteriaQuery 加载 ManyToOne 关系时遇到一些麻烦 明确告诉它,不得不复制我的实体注释似乎很奇怪 在查询中使这项工作:

  • 我有一个使用JPA + Hibernate的应用程序(hibernate-jpa-2.0-api)

  • 我的实体计算机,除了其他字段外还包含以下关系:

    @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name =“employee”,nullable = false) private Employee employee = null;

  • 据我所知,当我加载计算机实体时,与它相关的 Employee 应该自动加载到同一个查询中,但如果加载使用 CriteriaQuery 计算机,它不会那样工作。也就是说,当我创建 javax.persistence.criteria.CriteriaQuery 并执行它时,我可以 看到两个不同的查询:

    • 一个用于获取计算机
    • 另一个获取员工(甚至在我使用它之前......也就是说,它似乎是因为热切的注释而加载了这个实体)

从我的角度来看,这应该在同一个查询中完成,但不知道如何使其工作。如果我将“。fetch(”employee“)”添加到 criteriaquery ,它可以正常工作,但这样我在我的查询中复制实体中的配置,并从从维护的角度来看,这不是一个解决方案。

这种行为是正常的吗?可以修改吗?

由于

1 个答案:

答案 0 :(得分:1)

FetchType.EAGER意味着必须在根实体的同时获取链接实体,但是jpa规范没有说明执行此操作的策略(即使用一个或两个查询是留给持久性的选择)提供者实施)。

Hibernate提供注释@Fetch(FetchMode.JOIN),指示hibernate使用一个查询获取两个实体,因此您可以使用它来实现需要(但它不是标准的JPA注释)