2011-03-11 56 views
3

從我的客戶端應用程序中,我想用一個EJB方法調用存儲和刷新,而不是對兩個方法進行兩次調用。我做了一個EJB方法,使其調用其他兩個EJB方法,它看起來很簡單,就像這樣:使用EJB 2.0和JPA(Toplink)問題存儲和刷新對象

public ZippedObjectWrapper saveAndRefresh(final Item p_item) { 
    Long itemSavedId= save(p_item); 
    return refresh(itemSavedId); 
    } 

的問題是Toplink的這並不讓我讀出的數據,並在刷新部件拋出一個異常:

異常[TOPLINK-7123] 異常情況說明:在此UnitOfWork上調用了成功的writeChanges()。由於提交過程已經開始但尚未最終確定,現在唯一支持的操作是commit,commitAndResume,release,任何非對象級別的查詢或SQLCall執行。目前不允許執行executeQuery(ObjectLevelReadQuery)操作。

有什麼建議嗎?

編輯:更改方法簽名。

+0

請使用英文變量名稱。對於大多數SO用戶來說這是不可能的。 – atamanroman 2011-03-11 09:05:44

+0

你如何管理交易? – axtavt 2011-03-11 09:44:44

+0

你究竟是什麼意思? – Andrija 2011-03-11 09:51:28

回答

0

問題出在Toplink上,特別是它在我們使用的版本中處理數據庫操作的方式。有一個部分的解決方案,當你延長Toplink類或更好的時候,升級Toplink :)

1

不知道你的save()方法做了什麼,但我假設你在你的UnitOfWork上調用writeChanges()。 在您使用的版本中writeChanges()後不允許查詢。刪除writeChanges()應該可以解決問題。

如果您升級到EclipseLink和JPA,則可以在事務中查詢多次並使用flush()。您也可以使用RepeatableWriteUnitOfWork代替UnitOfWork來啓用多次調用writeChanges()並允許查詢。