我在书中看到了“hibernate in action”中的以下陈述。任何人都可以告诉我如何在运行时覆盖策略。并且你可以采取相反的方式,即我将策略设置为懒惰为假,我想将其设置为真?
“延迟提取可让您决定在第一个对象图形中加载多少对象图形 数据库命中以及哪些关联只应在它们第一次加载时加载 访问。延迟提取是对象持久性和对象持久性的基本概念 达到可接受表现的第一步。 我们建议,首先,所有关联都要配置为懒惰(或者可能是 在映射文件中获取批处理的懒惰。 然后可以覆盖此策略 在运行时通过强制急切提取的查询。“
答案 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)。