2010-08-21 51 views
0

我有这2个映射:冬眠急切地加载一个协会,是正常懒

<hibernate-mapping> 
    <class name="sample.Operator" table="OPERATOR"> 
     <id name="id" > 
      <generator class="native" /> 
     </id> 
     <property name="name" not-null="true"> 
      <column name="NAME" /> 
     </property> 
     <set name="pointCodes" inverse="false" lazy="true" cascade="save-update"> 
      <key> 
       <column name="OperatorID" /> 
      </key> 
      <one-to-many class="sample.PointCode" /> 
     </set> 
    </class> 

<hibernate-mapping> 
<class name="sample.PointCode" table="POINTCODE"> 
    <id name="id"> 
    <generator class="native" /> 
    </id> 
    <properties name="pointCodeKey" unique="true"> 
    <property name="pointCode" not-null="true"> 
    </property> 
    <property name="networkIndicator" not-null="true"> 
    </property> 
    </properties> 
    <property name="name" not-null="true"> 
    </property> 
</class> 
    </hibernate-mapping> 
featching的操作我想pointCodes到时候延迟加载

大部分的时间,所以我不想在映射中设置lazy =“false”,但是我有一个查询,例如session.createQuery("from Operator").list()我希望pointCodes关联不会被延迟取出 - 我该怎么做?

回答

3

Hibernate参考手册writes

A“取”加入允许关联,值 集合是使用单个选择 与父母沿着初始化 对象。这是 在 集合的情况下特别有用。它有效地覆盖 的外连接和延迟声明 的关联映射文件 和集合。有关更多 信息,请参见第20.1节, “获取策略”。

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

甲取加入通常并不需要 分配一个别名,因为 相关联的对象不应where子句(或任何其它 子句)中使用 。关联的对象是 也不直接返回 查询结果。相反,它们可能是通过父对象访问的 。你可能需要一个别名 唯一原因是 如果你是递归连接抓取一个 进一步收集:

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

fetch构造不能 查询中使用使用iterator()(虽然 滚动(所谓的)能使用)。取应符合setMaxResults()或 setFirstResult()共用一起使用 ,因为这些操作 是基于其 通常包含渴望 收集抓取重复的结果行,因此,行数 是不是你所期望的。 Fetch也不应该与条件即兴一起使用 。它是 可能创建一个笛卡尔产品 通过联接提取查询中的多个 集合,因此请注意 这种情况。加入获取多个 收藏角色可能会产生 包映射的意外结果, 因此,在此情况下,当 制定查询时,建议用户自行决定。 最后,请注意,完整连接抓取和 右侧连接抓取都没有意义。

0

只是为了参考,我遇到过这样的事情,有一次,hibernate总是急切地为我加载一个集合。

事实证明我有这个二传手:

public void setStreams(Set<StreamRef> streams) { 
    for (StreamRef s : (Set<StreamRef>) streams) { 
    s.setTape(this); // boo on hibernate, which apparently needs this. whoa! 
    } 
this.streams = streams; 
} 

这是由休眠调用(传递一个指针懒集),但是我对循环已基本调用它在该点被加载。如果这有助于任何追随者:)

你可以通过关闭会话来测试它是否懒惰,然后尝试迭代集合。如果它很懒,你会得到org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: XX.streams, no session or session was closed