Hibernate Lazy使用Initialize或EAGER加载

时间:2011-02-01 21:19:06

标签: hibernate

我有三张桌子,

users
user_associations
association_type.

用户通过users_associations表相互关联,然后为关联提供类型,如PARENT或FRIEND等。

当我调用我的视图时,我拥有用户彼此关联的表数据。在每个列表中,存在与当前用户数据,关联用户数据和关联类型列表的关系。

我正在使用Hibernate,我在EAGER获取数据和LAZY加载它之间感到困惑。当我打电话给我的DAO时,它看起来像这样

List<UsersAssoc> assoc = (List<UsersAssoc>)session.getNamedQuery("UsersAssoc.getAssoc").setInteger("id", id).list();

要让LAZY加载工作,我必须在所有子对象上调用Hibernate.initialize

    for(UserAssoc a : assoc ) {
           Hibernate.initialize(a.getUser() );
           Hibernate.initialize(a.getAssocTypes() );
           Hibernate.initialize(a.getAssociatedUser() );
    }

我需要参考我视图中的所有数据,并且我试图在不将所有数据存储在内存中的情况下进行操作。哪个选项最好?急切地加载它或在Hibernate中初始化每种类型。这甚至可能不是正确的做法。我需要一些方向。感谢

1 个答案:

答案 0 :(得分:0)

lazy描述了是否立即加载集合 - 所以如果你有lazy = false,hibernate默认会在你加载父集合时加载集合。它是一个映射属性。

使用hql时,您的提取策略会覆盖映射中的设置。来自文档:

“A”fetch“join允许使用单个select将关联或值集合与其父对象一起初始化。这在集合的情况下特别有用。它有效地覆盖了外部联接和惰性声明关联和集合的映射文件。有关更多信息,请参见第19.1节“获取策略”。“

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html

通常让你的所有映射都是懒惰的,但要使用专门的基于hql的DAO方法,这样你就可以针对特定情况以特定方式获取数据。