2011-04-29 49 views
0

編輯2011/5/11:關係正處於休眠+吉利德應用上關聯的對象刪除

我想這是比什麼是低於差些;在我部署的QA實例中,如果我多次刷新主儀表板,最終會刪除我的用戶的多對多組關聯。在這一點上,服務器端只有選擇語句被調用;希望我能通過這些最新的測試縮小範圍。

原創:

大家好。我對一個相當複雜的對象有問題;問題如下:當我將對象從客戶端發送到服務器進行保存時,它似乎是隨機清除關聯對象上的多對多關係。更糟糕的是,經過大約兩個月的意識到問題後,我無法自己再現問題。我有應用程序用於與質量檢查小組進行測試;他們每天都在使用該程序,並加入新的和遺留應用程序。這個問題一天發生多達三次。

我會盡我所能提供儘可能詳細的信息,並非常感謝任何人蔘觀!

應用程序框架是GWT 2.1 + Gilead + Hibernate 3 + MySQL InnoDB。我讓Hibernate處理任何級聯等,所以​​沒有在DB中定義,儘管所有外鍵都在DB中設置。

下面是來自映射一些摘錄:

<hibernate-mapping> 
<class name="com.example.domain.Close" table="CLOSE"> 

<many-to-one name="updateUser" 
class="com.example.domain.User" 
column="LAST_UPDATE_USER"/> 
</class> 
</hibernate-mapping> 

<hibernate-mapping> 
    <class name="com.example.domain.User" table="USER" batch-size="25"> 
    <set name="groups" table="USER_GROUP" lazy="true" batch-size="25"> 
     <key column="USER_ID"/> 
     <many-to-many column="GROUP_ID" class="com.example.domain.Group"/> 
    </set> 
    </class> 
</hibernate-mapping> 

<hibernate-mapping> 
    <class name="com.example.domain.Group" 
    table="GROUP" batch-size="25"> 
    <set name="users" table="USER_GROUP" lazy="true" inverse="true"> 
     <key column="GROUP_ID"/> 
     <many-to-many column="USER_ID" class="com.example.domain.User"/> 
    </set> 
    <set name="permissions" table="PERMISSION_GROUP" lazy="true" inverse="true"> 
    <key column="GROUP_ID"/> 
    <many-to-many column="PERMISSION_ID" 
     class="com.example.domain.Permission"/> 
    </set> 

<hibernate-mapping> 
    <class name="com.example.domain.Permission" 
     table="PERMISSION"> 
    <set name="groups" table="PERMISSION_GROUP" lazy="true"> 
     <key column="PERMISSION_ID"/> 
     <many-to-many column="GROUP_ID" 
     class="com.example.domain.Group"/> 
    </set> 
    </class> 
</hibernate-mapping> 

保存對象是簡單的saveOrUpdate()方法的調用:

Session session = gileadHibernateUtil.getSessionFactory() 
    .getCurrentSession(); 
session.beginTransaction(); 
try { 
    session.saveOrUpdate(close); 
} catch (Exception e) { 
    e.printStackTrace(); 
    session.getTransaction.rollback(); 
} 
session.getTransaction.commit(); 

return close; 

的關閉「UpdateUser兩個」是裝入的對象在用戶登錄時它被加載相關的組和權限,以便系統可以授予/拒絕對應用程序模塊的訪問。我做

close.setUpdateUser(exampleApp.getUser()); 

之前發送對象回服務器。

應用程序中有很多其他地方會發生此類操作,但不會產生不必要的副作用。它可能歸結爲與Close對象關聯的客戶端代碼的複雜性,或者說,我的實現。

我花了很多時間在官方Hibernate文檔上尋找可能出現的相關問題等,我想也許現在是尋求幫助的好時機。我必須站起來,堅持下去,但也許只是問問會幫助我解決問題。

我不確定還有什麼現在可以提供相關的。希望這裏到目前爲止有什麼相關性!

感謝收聽!

編輯

May 5 12:18:38 localhost jsvc.exec[10117]: Hibernate: insert into example_dev.RECENT_ITEM (OBJECT_TYPE, OBJECT_ID, DATE, USER_ID) values (?, ?, ?, ?) 
May 5 12:18:38 localhost jsvc.exec[10117]: Hibernate: delete from example_dev.PERMISSION_GROUP where PERMISSION_ID=? 
May 5 12:18:38 localhost last message repeated 19 times 
May 5 12:18:38 localhost jsvc.exec[10117]: Hibernate: delete from example_dev.USER_GROUP where USER_ID=? 
May 5 12:18:38 localhost jsvc.exec[10117]: Hibernate: delete from example_dev.USER_DESIGNATION where USER_ID=? 

看來,刪除正在發生此插入後的權利..先前的操作都是選擇。但User中沒有任何應該從RecentItem級聯。

回答

1

經過大量的研究,我得出了一些結論,並能夠採取行動。首先,我在Gilead論壇上搜索了很多內容後瞭解到,它不再是actively maintained。應該早點注意到。與此同時,我開始閱讀關於RequestFactory的內容,經過幾天的研究,我決定嘗試遷移到此。

這是一個相當大的項目,大概有50個域對象,有些有很多對象關聯。我花了大約40-50個小時來重寫從Gilead + GWT RPC到使用RequestFactory的所有內容。我對代碼和結構發生的變化感到非常滿意。到目前爲止,我不必爲創建DTO代理對象而煩惱,我趁機切換到Hibernate Annotations,擺脫映射文件。

重構代碼以利用RequestFactory所需的讀取/編輯/保存週期有時很棘手。它確實讓我有機會改進一些代碼。

好消息是,問題已解決。沒有更多的多對多關聯被神祕地刪除。我最好的猜測是我在Gilead中遇到了一個錯誤,或者我對它的使用不正確,或者在遷移到Annotations時可能解決了一個問題。

我碰到一些重要的資源跑一邊學習RequestFactory + Hibernate中,許多通過StackOverflow的(再次感謝!):

Using GWT RequestFactory with Objectify - 是偉大的,得到RequestFactory如何與後端交互的感覺,有些方法和樣板減少代碼。

下面希望更多鏈接..我還是個菜鳥,所以我以超鏈接#限制,我可以張貼:)

我學到了很多東西,和我在RequestFactory越來越流暢。我會盡我所能保持注意並在我認爲可以的地方幫忙。

感謝StackOverflow!

+0

[集合中的Hibernate增強類名](http://groups.google.com/group/google-web-toolkit/browse_thread/thread/75c52203f4a5cafc) - 進入這個問題,其中類名將被修改休眠對於同一類型的多個集合 - 花了一點時間來追蹤它。錯誤是'域類型Foo _ $$ _ javassist_45無法發送到客戶端' – CyDharttha 2011-06-10 17:06:15

+0

[Custom ServiceDecorator](http://code.google.com/p/listwidget/source/browse/trunk/src/main/java/com/ turbomanage/listwidget/server/servlet/BugFixSLD.java?r = 25) - 上面的一些幫助,來自上述Objectify教程的示例應用程序 – CyDharttha 2011-06-10 17:06:45