2013-03-27 56 views
0

我想將Hibernate對象添加到HTTP會話中。 HTTP會話參與集羣環境並通過序列化進行復制。在序列化HTTP會話時,會拋出延遲加載異常,因爲它超出會話範圍。似乎應該有一種方法來指示hibernate不嘗試序列化未被加載的對象。畢竟,這是對象圖的狀態,並且序列化會轉儲對象圖的狀態。如果一個對象僅僅是一個代理,因爲它沒有被加載,那麼只有代理應該被序列化。對?無論如何,這是我希望看到的行爲。任何想法如何做到這一點?在序列化休眠對象時避免延遲加載異常

當然,期望是序列化的對象可以在另一臺服務器上反序列化,並且會話將被適當地處理。

回答

2

在羣集環境中,您可能只想在HTTP會話中存儲objectIds。這樣羣集節點將能夠查詢真實節點的數據庫。

另一種選擇是從休眠會話中分離出Hibernate對象並對其進行序列化。 (在這種情況下,您可能需要初始化惰性字段)。爲了初始化您可能想要使用的惰性加載字段this

通常,如果您要在服務器之間傳遞對象,則必須初始化所有惰性加載字段,否則序列化時你會得到一個異常,因爲你將無法序列化/反序列化休眠會話。

是的,不要混合HTTP會話與休眠會話。這些是完全不同的東西。

+0

Funtik,感謝您的迴應!這涉及遺留應用程序將Hibernate對象放入HTTP會話中。這工作得很好,直到它被部署到集羣環境中,並且使用序列化來複制狀態。重構只存儲對象ID將是一件很有意義的事情。我希望找到一個解決方案,Hibernate會避免序列化未加載的對象。 – ptsw 2013-03-27 21:47:26

+1

嘗試從休眠會話中分離對象,然後將其添加到HTTP會話 – WeMakeSoftware 2013-03-27 22:03:59

+0

Funti,另一個很好的建議,但遺憾的是在我的情況下這是可行的。該應用程序使用Tapestry,它爲封面下的會話添加了某些類屬性。因此,我沒有可見性指出將Hibernate對象添加到會話中。 – ptsw 2013-03-28 14:24:55