2011-06-09 35 views
0

我目前正在開發一個GWT/RequestFactory和Hibernate/JPA作爲持久性提供者的應用程序。如何擺脫GWT中的「ID爲XXX的持久實體具有空版本」?

所以我開始修改我的Entity類,創建了EntityProxies,在orm.xml中添加了相應的映射的Version列(對於註釋愛好者抱歉,我仍舊這樣做),得到hibernate生成數據庫模式正確,但是當我嘗試做的事情在裏面我有例外:

@ProxyFor(XXXXX) 
public interface UserProxy extends EntityProxy { 
    public Long getId(); 
    public void setId(Long id); 
    public Integer getVersion(); 
    public void setVersion(Integer version); 

    // removed ... 
} 

"The persisted entity with id XXX has a null version"

我看看數據庫表,該版本的列有...... 用值爲

所以有人可以告訴我什麼是錯的?任何幫助,將不勝感激......

非常感謝,

回答

1

坐落在SimpleRequestProcessor.createReturnOperations()斷點,其中domainVersion != null檢查正在取得進展。是沒有由服務方法新創建的版本的對象,還是由客戶端操作的對象?如果它是新創建的,你是否有某種請求範圍的自動提交進行,在請求完成後版本將被分配到哪裏?如果它是客戶端發生變異的實體,請參閱刪除setId()setVersion()方法是否有幫助。通常,您的EntityProxy界面不應該包含setId()setVersion()方法,因爲這些屬性只能由您的持久性機制來設置。

+0

我已經設置了斷點,並最終找到了我期待從domainVersion = service.getVersion(domainObject)的對象;不是我得到的那個...我有我的域對象的繼承層次結構,所以我得到它的工作。我也跟着你的建議,關於不公開setId()和setVersion()方法...謝謝你的技巧!你似乎很瞭解GWT的內部,你是如何發現它恰好在這一點上必須在SimpleRequestProcessor中設置斷點?這太神奇了...再次感謝很多... – kaffein 2011-06-10 14:46:49

1

如果您使用Locator類,另一個原因可能是Locator getVersion()方法返回null而不是例如。返回實體的版本。 Eclipse默認生成一個空返回值。