Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在运行时覆盖hibernate抓取策略_Hibernate - Fatal编程技术网

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

如何在运行时覆盖hibernate抓取策略,hibernate,Hibernate,我在《行动中的冬眠》一书中看到了以下陈述。任何人都可以告诉我如何在运行时重写策略。你们能用相反的方法吗,我把抓取策略设为false,我想设为true “延迟抓取允许您决定在第一个窗口中加载多少对象图 数据库命中率以及只有在第一次命中时才应加载哪些关联 惰性抓取是对象持久性和 达到可接受性能的第一步。 首先,我们建议将所有关联配置为惰性(或者 批处理(惰性)获取映射文件。然后可能会覆盖此策略 在运行时,通过强制执行即时抓取的查询“如果您使用HQL进行查询,可以使用“fetch”关键字指定即时抓取,

我在《行动中的冬眠》一书中看到了以下陈述。任何人都可以告诉我如何在运行时重写策略。你们能用相反的方法吗,我把抓取策略设为false,我想设为true

“延迟抓取允许您决定在第一个窗口中加载多少对象图 数据库命中率以及只有在第一次命中时才应加载哪些关联 惰性抓取是对象持久性和 达到可接受性能的第一步。 首先,我们建议将所有关联配置为惰性(或者 批处理(惰性)获取映射文件。然后可能会覆盖此策略
在运行时,通过强制执行即时抓取的查询

如果您使用HQL进行查询,可以使用“fetch”关键字指定即时抓取,如下所示:

from Cat as cat
    inner join fetch cat.mate
    left join fetch cat.kittens child
    left join fetch child.kittens
如果您使用的是Criteria查询API,则可以使用setFetchMode指定获取模式

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

使用获取配置文件:

对于渴望的查询,您可以使用LINQ提供程序编写如下内容:

List<Customer> customers = session.Query<Customer>().Fetch(c => c.Orders).ToList();

您也可以获取孙子集合(请参阅)。

除非使用JPA2条件时目标实体出现在选择列表中,否则Hibernate似乎不喜欢添加“左连接获取”。如果添加root.fetch(“someChildProperty”)以请求左联接提取,则会产生错误“查询指定的联接提取,但提取关联的所有者不在选择列表中”。思想?JPA2似乎让人很难说出“大部分时间懒散地获取此信息,但在这种情况下却急切地获取此信息”。非常感谢!非常感谢,安德鲁!似乎您可以使用fetchprofiles来用“join”覆盖“select”,但不能用“join”覆盖“select”#
select
    customer0_.CustomerId   as CustomerId0_0_,
    customer0_.ContactName  as ContactN3_0_0_,
    orders1_.CustomerId     as CustomerId0__,
    orders1_.OrderId        as OrderId0__
    orders1_.OrderDate      as OrderDate3_1_,
from   Customers customer0_
   left outer join Orders orders1_
     on customer0_.CustomerId = orders1_.CustomerId