在运行时临时将FetchType.LAZY更改为FetchType.EAGER(Hibernate / JPA)

时间:2014-03-28 16:08:09

标签: spring hibernate jpa

我的实体的某些字段标记为LAZY。为了加载LAZY字段,只需在会话打开时访问getter,以便ORM代理执行select个子查询。

但是,当您需要完全解析的对象作为join提取的急切关系时,这不是最理想的。

如何将某些字段标记为EAGER临时仅用于一个查询?

这可能是JPA标准还是只有像Hibernate这样的专有扩展?

2 个答案:

答案 0 :(得分:6)

Hibernate有一个名为Fetch Profiles的功能可以解决这个问题。它需要访问Hibernate Session,但您可以使用unwrap()EntityManager访问它。

如果您需要纯JPA解决方案,则在需要提取的用例中加载对象时,可以使用join fetch的查询。

<强>更新 JPA 2.1(由Hibernate 4.3实现)支持类似于获取配置文件的功能 - entity graphs

答案 1 :(得分:0)

春季JpaRepository允许使用org.springframework.data.jpa.repository.EntityGraph标记查询(包括自定义):

@Entity Book {
     @Id Long id;
     @OneToMany List<Author> authors;
}

@EntityGraph(attributePaths = {"authors", "author.address"})
@Query("select b from Book b" +
        " where b.id in (:ids)")
List<Book> loadAll(@Param("ids") List<Long> ids);