如何在运行时覆盖hibernate获取策略

Tsu*_*sai 20 hibernate

我在"hibernate in action"一书中看到了以下陈述.任何人都可以告诉我如何在运行时覆盖策略.并且你可以采取相反的方式,即我已经获取策略设置懒惰为假,我想将其设置为真?

"延迟提取允许您决定在第一次数据库命中时加载了多少对象图,以及只有在首次访问时才应加载哪些关联.延迟提取是对象持久性的基本概念,也是实现可接受性能的第一步.我们建议,首先,所有关联都要配置为在映射文件中进行延迟(或者可能是批处理的延迟)获取.然后可以在运行时通过迫使急切提取的查询来覆盖此策略."

And*_*ate 32

如果您在查询中使用HQL,则可以使用"fetch"关键字指定您的急切提取,如下所示:

from Cat as cat
    inner join fetch cat.mate
    left join fetch cat.kittens child
    left join fetch child.kittens
Run Code Online (Sandbox Code Playgroud)

如果您正在使用Criteria Query API,则可以使用setFetchMode指定获取模式

List cats = sess.createCriteria(Cat.class)
    .add( Restrictions.like("name", "Fritz%") )
    .setFetchMode("mate", FetchMode.EAGER)
    .setFetchMode("kittens", FetchMode.EAGER)
    .list();
Run Code Online (Sandbox Code Playgroud)

  • 似乎Hibernate对添加"左连接提取"感到不满意,除非在使用JPA2标准时目标实体出现在选择列表中.如果添加了root.fetch("someChildProperty")来请求左连接提取,则会产生错误"查询指定的连接提取,但提取的关联的所有者不在选择列表中".想法?JPA2似乎很难说"大部分时间都是懒散地抓住这个,但是在这种情况下急切地". (3认同)