hibernate延迟加载

时间:2009-10-28 09:23:06

标签: java hibernate java-ee lazy-loading

我的hibernate对象A将对象B,C和D作为属性:

A.getB().getName();  
A.getC().getTitle();

现在,我想加载A及其所有属性而不会得到LazyInitializationException。 所以,我需要完全加载A的对象图。

有没有在hibernate中检索对象图形的通用方法?

3 个答案:

答案 0 :(得分:3)

模式Open Session in View有助于避免LazyInitializationException。同样在Seam中,它由using extended PersistentManager and conversation scope

完成

Antother解决方案非常渴望像this example或KLE一样回答。

答案 1 :(得分:3)

您可以在.hbm.xml映射文件中使用属性“lazy =”false“'指定它,或者您可以使用createAlias或createCriteria方法在criteria对象中指定它。

也可以将fetchMode设置为特定关联的条件

答案 2 :(得分:2)

有时候你想要加载完整的对象图,有些时候你想要更少的数据(并且不想支付与加载所有这些相关的性能损失)。因此,假设您的需求各不相同。

一般来说,Hibernate延迟加载,但您可以使用以下几种方法之一加载其他数据(有关详细信息,请参阅Hibernate文档):

  1. 当你的会话开始时(你没有关闭它),如果你查询A的字段,它们可以按需加载。这非常容易和灵活,但如果它进行大量的数据库调用,效率会很低。
  2. 您可以创建 HQL请求以指定要加载A,还可以指定某些字段。在查询中使用FETCH。
  3. 您可以使用条件 API执行相同的操作。您可以进行方法调用,而不是指定查询。
  4. 懒惰的样本:

         A a = ...; // load A
         String name = a.getB().getName(); // triggers an implicit query to load B
    

    HQL示例:

         select a 
         from A a
         left join a.b b
         left join a.c c
         where a.id = :id