2010-08-21 49 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