【问题标题】:JPA+Hibernate: CriteriaQuery not loading eager ManyToOne relationJPA+Hibernate:CriteriaQuery 不加载急切的多对一关系
【发布时间】:2013-10-07 07:19:15
【问题描述】:

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

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

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

    @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "employee", nullable = false) 私人雇员雇员 = null;

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

    • 一个获取计算机
    • 另一个来获取 Employee(甚至在我使用它之前......也就是说,由于急切的注释,它似乎正在加载这个实体)

在我看来,这应该在同一个查询中完成,但不知道该怎么做才能完成这项工作。如果我将 ".fetch("employee")" 添加到 criteriaquery 中,它可以工作,但这样我会在查询中复制实体中的配置,并且从从维护的角度来看,这不是解决办法。

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

谢谢

【问题讨论】:

    标签: java hibernate jpa-2.0


    【解决方案1】:

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

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

    【讨论】:

    • 我已经对此进行了测试,但没有成功。我现在又试了一次,但即使删除了另一个 fetch 值,它也不起作用。也许这与使用“entityManager.getCriteriaBuilder()”有关,在构建查询时忽略了这些注释......但在后面的步骤中考虑它们......
    猜你喜欢
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 2016-04-25
    • 1970-01-01
    • 2014-06-21
    相关资源
    最近更新 更多