2011-03-28 54 views
2

使用最新的休眠3 ...休眠禁用集合提取

有一個模型,其中Element類有一個關係類的2個列表集合。 Element是擁有(來源)Relation的地方,另一個是目的地。

<class name="Element"....> 
    .... 

    <list name="sourceRelations" ....> 
     ... 
     <one-to-many class="...Relation" /> 
    </list> 

    <list name="destinationRelations" ....> 
     ... 
     <one-to-many class="...Relation" /> 
    </list> 
</class> 

<class name="Relation"....> 
    .... 
    <many-to-one name="source" class="...Element" ... 
     <column name="SOURCEID" sql-type="INTEGER" not-null="true" /> 
    </many-to-one> 
    <many-to-one name="destination" class="...Element" ... 
     <column name="DESTINATIONID" sql-type="INTEGER" not-null="true" /> 
    </many-to-one> 
</class> 

映射基本上只在生成條件查詢時有用。否則,當獲取一個元素(只通過一個標準,從來沒有通過獲取/加載),我從來不希望Hibernate實際獲取關係集合。決不。現在在我的代碼中,我清理Element對象,然後通過創建一個新元素並轉移要傳播的屬性(即sourceRelation/destinationRelation永遠不會傳輸)來返回它們。針對Relation對象的條件查詢也是如此。源/目的地屬性(即元素)被清除。

有沒有辦法通過Hibernate攔截器代理Element實體或使用Tuplizers來基本強制所有Element實體將sourceRelation/destinationRelation屬性清空?

回答

0

是否將關係集合映射爲lazy =「true」而不提供所需的行爲?

如果情況並非如此,那麼另一種方法是使用類繼承。擁有一個沒有映射集合的Element的基類,以便在這些情況下使用您現在手動修改返回的數據,然後使用一個僅添加這些集合的子類,以便在需要大量數據時使用。

+0

整個想法不必子。元素/關係類應該是通用的。 – 2011-05-30 08:46:53

+0

爲什麼懶惰=「真」不夠? – 2011-06-01 15:55:14

0

This answer提醒我其他的方法,可以讓你避免使用子類。

創建包含只是你想要的字段的構造,並用它在你的HQL是這樣的:

select new Element(e.id,...) from Element e... 

我加入了第二個答案,因爲這是一個比我的第一個答案不同的方法。

+0

很酷的建議。使用標準進行查詢並獲得好的結果。但是如果你可以在HQL中完成,那麼它應該可以與其他API一起使用。 將玩耍並找回你。曾經嘗試過你的玩伴嗎?基本上你的建議是我在我的代碼中所做的。創建一個新的元素並填充我想要的。這只是它看起來像一個額外的步驟和浪費的對象。 – 2011-06-02 19:57:07

+0

我大量使用HQL/JPQL,因爲我喜歡在開始時利用Hibernate對Named Queries的檢查作爲我的開發過程中的快速失敗策略。我還沒有親自嘗試過其他方法。 – 2011-06-02 21:04:12