2013-05-25 48 views
2

我想用GWT-RPC將hibernate對象轉移到前端。當然,我不能轉移註釋類,因爲註釋不能編譯爲javascript。所以我完全在「.hbm.xml」中完成了hibernate映射。這對於非常簡單的對象來說很好。但是,只要我加入更復雜的東西,比如用一個例子來實現oneToMany關係。一個集合,編譯器會抱怨集合的一些序列化問題(但集合中的對象也是可序列化的)。Hibernate對象和GWT-RPC

我猜這是行不通的,因爲hibernate創建了一些GWT無法解釋的特殊集合?

有沒有什麼辦法可以解決這個問題,或者我需要另一種方法讓我的對象到達前端?

編輯:看來我的方法是不可能與RPC,因爲休眠更改對象。 (請參閱thanos的回答)。 google有一個更新的方法來將對象傳輸到前端:請求工廠。它看起來非常好,我現在會嘗試。

編輯2:請求工廠工作完美,比RPC更方便!

回答

2

這是來自GWT文檔的引用。它表示,hibernate將對象從原始表單中更改爲使其持久化。

這對於GWT RPC意味着什麼,當對象準備好通過線傳輸時,它實際上不是編譯器認爲要傳輸的對象,所以當試圖反序列化時,GWT RPC機制不再知道類型是什麼,並拒絕反序列化它。

不幸的是,實施解決方案的唯一方法是製作DTO及其合適的轉換器。

使用Gilead是一個更清潔的方法(不需要所有這些DTO代碼),但DTOs更多ligtweight,從而通過電線產生更少的流量。

無論如何也有推土機,這將爲您生成的DTOs,所以沒有太多的需要喲實際編寫的代碼。

無論哪種方式,mchq08表示他提供的鏈接將解決許多問題。

我也會提出另一個建議!分開項目。創建一個新的應用程序作爲模型,並將該jar包含到GWT中。通過這種方式,您的GWT項目將幾乎完全在GUI中,並且jar庫也可以重新用於其他項目。

+0

Gilead是一個很好的解決方案,但問題在於Gilead不再受支持,如果使用它,則會陷入過時的GWT版本。 – ATrubka

0

我使用了下一個批准:對於每個hibernate實體類,我有沒有任何休眠的東西的客戶端副本。此外,我有機制在客戶端< - >服務器分支之間複製數據。 這是工作,但我相信目前的GWT版本應與休眠註釋類工作..

+0

你確定,hibernate-annotated類應該可以在新的GWT版本中工作嗎?找不到任何關於這方面的信息。副本對象是一種解決方案,但它們也是很多樣板代碼。 – jan

2

當我創建我的RPC到Hibernate我用這個例子作爲框架。我建議下載它們的源代碼並閱讀「集成策略」一節,因爲我覺得「基本」部分沒有證明DTO是正確的。本教程沒有做的一件事就是從網頁的接收和發送部分(它轉換爲JS),這就是爲什麼我建議你下載他們的源代碼並查看他們如何發送/接收每個DTO。

發佈堆棧跟蹤和一些您認爲對解決此錯誤有用的代碼。

Google's GWT & Hibernate

讀這(和源代碼)可能需要一些時間,但確實有助於瞭解他們的邏輯。

0

在客戶端項目上,我使用Moo(我寫的)將Hibernate增強的域對象相對輕鬆地轉換爲DTO。

+0

謝謝,但我已經找到gwt請求工廠的完美解決方案:) – jan