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

gav*_*koa 4 spring hibernate jpa

我有一些实体,其中一些字段标记为LAZY.为了LAZY在会话打开时加载 字段只是访问getter,所以ORM代理执行select子查询.

但是,当你需要完全解析的对象作为获取的渴望关系时,这是次优的join.

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

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

axt*_*avt 6

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

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

更新: JPA 2.1(由Hibernate 4.3实现)支持类似于获取配置文件的功能 - 实体图.


gav*_*koa 4

SpringJpaRepository允许使用以下标记查询(包括自定义)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);
Run Code Online (Sandbox Code Playgroud)