2013-05-18 55 views
0

我想批量從數據庫中獲取多個Hibernate映射對象。據我所知,目前尚不支持Hibernate(或者我知道的任何Java ORM)。所以我寫了使用RMI實現此API的驅動程序:批處理獲取休眠映射對象

interface HibernateBatchDriver extends Remote 
{ 
    Serializable [] execute (String [] hqlQueries) throws RemoteException; 
} 

這個API的實現打開對本地數據庫Hibernate會話,發出查詢一個接一個,批了的結果,他們返回到呼叫者。這樣做的問題是被取回的對象在被髮送回去之後不再有任何Session連接到它們,並且因此稍後訪問來自這些對象的懶惰獲取的字段最終以無會話錯誤結束。有沒有解決這個問題的方法?我不認爲Session對象是可序列化的,否則我會通過線路發送它們。

+0

你想發送通過電線查詢獲取的對象嗎? – nakosspy

+0

nakosspy:是的。這就是'執行'返回 – JRR

回答

1

由於@dcernahoschi提到,Session對象是Serializable,但JDBC連接不是。可串行化意味着您將某些內容保存到文件中,稍後再讀取它並且它是同一個對象。您無法將JDBC連接保存到文件,並在稍後從該文件恢復。您應該必須打開一個新的JDBC連接。

因此,即使您可以通過RMI發送會話,您也需要在遠程計算機上使用JDBC連接。但是,如果可以在遠程計算機中設置會話,那麼爲什麼不在該計算機中執行查詢呢?

如果你想通過RMI發送查詢結果,那麼你需要做的是無需懶惰地取回整個對象。爲了做到這一點,您必須將所有關係定義爲在您的映射中急切提取。

如果您無法將映射更改爲渴望,則可以選擇獲取每個對象的「深層」副本並通過RMI發送此對象。創建對象的深層副本將需要一些努力,但如果無法將映射更改爲提前獲取,那麼它是唯一的解決方案。 這種方法意味着你的接口方法必須改變,以這樣的:

List[] execute (String [] hqlQueries) throws RemoteException; 

的方法結果的每個列表將繼續通過一個查詢獲取的結果。

+0

哦。我錯過了RMI部分。在這種情況下,發送會話當然沒有意義。 +1。 – dcernahoschi

1

休眠Session對象是Serializable。底層的JDBC連接不是。因此,在序列化之前,可以斷開()該會話與JDBC連接的連接,並在反序列化之後重新連接()它。

不幸的是,如果您需要將會話發送到無法獲得新的JDBC連接的主機,則這無助於您。所以唯一的選擇是完全加載對象,將其序列化併發送到遠程主機。

+0

+1糾正我。我會編輯我的答案。是的,'Session'是'Serializable'。不幸的是,這對@JRR來說還不夠好。在這種情況下,問題是他無法通過RMI發送它,因爲遠程計算機無法連接到數據庫。如果會話可以在遠程計算機中恢復,則不是通過RMI發送查詢,而是在遠程計算機中創建和執行它們。 – nakosspy