2013-10-10 168 views
1

我正在使用Hibernate 3.6.9作爲ORM和xml映射的Java應用程序。其實,有兩個實體,檢測的修訂檢測的修訂一個一對多的關係,其映射到其整個設置完成修訂:休眠派生實體

<set name="_Revisions" table="trevision" inverse="true" lazy="true"> 
    <key> 
     <column name="id_detectable" /> 
    </key> 
    <one-to-many class="com.company.model.tasks.Revision" /> 
</set> 

也可以參考this similar question我已經發布。我現在想要的是得到最後的那個版本中修改類的獨立領域:

<many-to-one name="_LastDoneRevision" column="id_detectable" 
      class="com.company.model.tasks.Revision" lazy="false" /> 

我想實現與那就是有最後的修改(我在大多數情況下使用)總是熱切地提取。除此之外,如果需要,我可以獲得整套修訂版,但默認情況下會延遲初始化。要實現這一點,可能需要使用自定義查詢來從整個集合中獲取最後一次修訂。

我認爲這不能用公式來實現,因爲它們只是檢索一個值,而不是整個實體。我希望能夠以某種方式選擇many-to-one關係應該具有的內容。

解決方案可能是to use a view而不是可檢測表本身。這樣我可以有這將對該視圖映射一個VDetectable實體和視圖可以獲取所有原始屬性加上參考修訂我感興趣的

反正是有可能是否只使用原始實體加載?

回答

3

我不保證其高效,甚至做了正確的方式,但我也做了類似的事情是這樣的...

<many-to-one 
    name="theMaxSetting" 
    class="myPath.domain.Setting"    
    formula="(select MAX(s.SETTING_ID) from setting s where s.profile_id = PROFILE_ID)" 
/> 

在我的情況下,配置文件有許多設置。該公式有點棘手,但基本上公式返回一個數字,休眠使用該數字來查找相應的實體。

只是不言自明的情況下... Profile.java現在包含

private Setting theMaxSetting; 
//.... 
//getter/setter 

link顯示了使用配方的各種例子。一些示例演示瞭如何將它用於sql查詢,其他示例演示了它可用於返回實體。我不認爲有一個將它們合併成一個用例,但所有的部分都在那裏。

+0

感謝您的回答。如果您能夠在網絡中提供此方法顯示的應用參考,我將不勝感激。 –

+0

回答更新了Web引用。 – user2046211

+0

感謝您的鏈接,無論如何,我不知道公式可以用於這種方式(如果你看看引用,它只顯示實例屬性,而不是id本身)。它工作正常,如果有人提供不同的方式,我只能等待。 –

1

是的,一個公式是你想要的解決方案。只需向Hibernate提供一個計算您希望鏈接的實體主鍵的公式即可。我猜你的xml將如下所示:

<many-to-one name="_LastDoneRevision" 
    class="com.company.model.tasks.Revision" lazy="false"> 
    <formula> 
    (select max(r.id_revision) 
    from revision r 
    where r.id_detectable = id_detectable) 
    </formula> 
</many-to-one>