java - Hibernate 如何在 hibernate 标准中将 eager、select、batch 更改为延迟加载

标签 java hibernate jpa criteria

我有许多 OneToMany 关系,在大多数情况下需要急切地加载,如下所示:

@OneToMany(fetch = FetchType.EAGER, mappedBy = "bar")
@Fetch(FetchMode.SELECT)
@BatchSize(size = 10)

但是,在极少数情况下,我需要将 hibernate 标准中的它更改为延迟加载(仍然选择和批处理)。但我不知道该怎么做。 当我尝试 here 中的解决方案时-

criteria.setFetchMode("propertyName", FetchMode.SELECT);

它仍然急切地加载。

我的标准现在看起来像这样:

Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Bar.class);
criteria.add(Restrictions.eq("valid", true));
criteria.add(Restrictions.idEq(barId));
Bar result = (Bar) criteria.uniqueResult();

这是实体,仅用于说明目的...

@Entity
@Table(name = "BAR", schema = "UD")
public class Bar {
    private List<Foo> foos;

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "bar")
    @Fetch(FetchMode.SELECT)
    @BatchSize(size = 10)
    public List<Foo> getFoos() {
        return foos;
    }
}

我正在使用 Hibernate 5.1.10.Final

最佳答案

我不知道是否可以进行按需获取,但有一种技术可用于此,您可以使用 fetch Bar在自定义查询中使用构造函数的对象:

@Query("SELECT new BAR( <add other required fields except FOOs> ) from BAR")

注意:这与延迟加载不同。如果您需要Foo晚于您必须再次进行数据库调用。

关于java - Hibernate 如何在 hibernate 标准中将 eager、select、batch 更改为延迟加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61248017/

相关文章:

java - Web 应用程序中 Hibernate 对象的典型生命周期 -?

java - 级联持久化无法为新实体生成主键,为什么?

java - 在 JPQL 中使用 select unique 并检索所有列

java.io.IOException : Incomplete HDFS URI, 没有主机

java - Apache Archiva 2.0 Jetty WebAppContext :Failed startup of context o. e.j.w.WebAppContext

java - 如何使用 JPA 在 Hibernate 中获取计数?

java - 在 hibernate 中使用可序列化我使用什么底层数据库类型

java - 带有 JPA 的 ObjectDB

java - 如何同步 jBatch 执行?

java - 有没有办法进一步优化Graham Scan算法来找到凸包?