0

我在让CriteriaQuery加载ManyToOne关系而不明确告诉它时遇到了一些麻烦,而且必须在查询中复制我的实体注释以使其工作似乎很奇怪:

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

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

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

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

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

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

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

谢谢

4

1 回答 1

1

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

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

于 2013-10-01T08:27:50.157 回答