2013-10-01 99 views
0

我遇到了一些麻烦,使CriteriaQuery中负载多对一的关系,而不 明确告诉它,它似乎很奇怪有查询复制我的实体注释 到使这项工作:JPA + Hibernate的:CriteriaQuery中不加载急于多对一关系

  • 我使用JPA +休眠(Hibernate的相关JPA-2.0-API)

  • 我的实体的COM应用程序帕特,除了其它字段包含关系:

    @ManyToOne(取= FetchType.EAGER) @JoinColumn(名称= “雇员”,可为空=假) 私人雇员雇员= NULL;

  • 据我知道,当我打开一个计算机实体,该员工有关,应该在同一个查询自动加载,但是,如果用CriteriaQuery中加载计算机,它不这样工作。也就是说,当我创建一个javax.persistence.criteria.CriteriaQuery并执行它,我可以 看到两个不同的查询:

    • 一个来获取计算机
    • 另一个去取员工(即使以前我用it..that是,它似乎是由于装载的渴望诠释这个实体)

从我的角度来看,这应该在相同的查询中完成,但不知道如何做这项工作。如果我将“.fetch(”employee“)”添加到标准查询它可以工作,但这样我就在我的查询中复制实体中的配置,并且从维护的角度来看,这是不是解决方案。

这种行为是否正常?它可以被修改吗?

感谢

回答

1

FetchType.EAGER意味着该链接的实体必须同时根实体中获取,但JPA的规格不说这个(即使用一个或两个查询做策略吗是留给持久性提供者实现的选择)。

休眠提供注解@Fetch(FetchMode.JOIN)指示冬眠一个单一的查询来获取两个实体,所以你可以用它来达到什么样的需求(但它不是一个标准的JPA注释)

+0

我已经测试了这一点,没有工作。我现在再试一次,但即使删除了其他提取值,也不起作用。也许这与使用“entityManager.getCriteriaBuilder()”有关,在构建查询时忽略这些注释......但在后面的步骤中考虑它们... – sschz