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

时间:2011-03-25 16:31:55

标签: hibernate

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

“延迟提取可让您决定在第一个对象图形中加载多少对象图形 数据库命中以及哪些关联只应在它们第一次加载时加载 访问。延迟提取是对象持久性和对象持久性的基本概念 达到可接受表现的第一步。 我们建议,首先,所有关联都要配置为懒惰(或者可能是 在映射文件中获取批处理的懒惰。 然后可以覆盖此策略 在运行时通过强制急切提取的查询。“

3 个答案:

答案 0 :(得分:32)

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

from Cat as cat
    inner join fetch cat.mate
    left join fetch cat.kittens child
    left join fetch child.kittens

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

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

答案 1 :(得分:7)

答案 2 :(得分:-4)

对于急切的查询,您可以使用LINQ提供程序编写类似的内容:

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

这将在一个SQL查询中填充所有已获取客户的所有订单:

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

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