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