首页 文章

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

提问于
浏览
0

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

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

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

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

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

  • 一个用于获取计算机

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

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

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

谢谢

1 回答

  • 1

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

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

相关问题