2010-10-12 94 views
1

我建立了一個Spring ROO應用程序,將持久性設置爲OpenJPA並創建了一些實體。 然後我用Apache Wicket替換了Spring MVC。東西似乎工作正常,我已經成功顯示客戶實體列表。Apache Wicket,OpenJPA和Spring/ROO

接下來是客戶的編輯視圖。現在我已經制作了一個Wicket表單,它直接使用OpenJPA實體作爲表單模型,因此我必須使實體類實現Serializable。

現在,我不知道如何正確地實施OpenJPA持久性,我現在已經得到是這樣的:

@Override 
protected void onSubmit() { 
    try { 
     if (customer.getId()!=null) { 
      customer.merge(); 
     } 
     else { 
      customer.persist(); 
     } 
    } 
    catch (Exception e) { 
     throw new Error(e); 
    } 
    super.onSubmit(); 
} 

這樣的作品,但只有每個Customer對象一次。不知何故。 也就是說,我提交表單一次,它既與新客戶(.persist())和現有客戶(.merge())一起工作。但是,我再次提交形式爲同一客戶我得到這個錯誤(我這裏補充了一些換行):

<openjpa-2.0.0-r422266:935683 nonfatal store error> 
org.apache.openjpa.persistence.OptimisticLockException: 
An optimistic lock violation was detected when flushing object instance "no.magge.iumb.domain.crm.PrivateCustomer-379" to the data store. 
This indicates that the object was concurrently modified in another transaction. 

我的問題是,什麼是OpenJPA中堅持正確的方式和爲什麼我收到這個錯誤?

Wicket-wise:我應該創建一個單獨的Wicket IModel與可拆卸的客戶模型,這可能是我有這些問題的原因嗎?

非常感謝任何建議!

+0

正如請注意,如果你還沒有,請查看Open Session iv View模式,它是i Wicket + Spring中的多重化。這聽起來與你的問題有關,但是我只和Hibernate一起工作,所以我不能制定一個適合你的答案。 – Tim 2010-10-12 12:42:24

+0

嗯,是的 - 可能這是相關的。正如在下面的答案中所述,我應該重新設計應用程序,以便我可以在不同的應用程序級別進行一些測試。我使用OpenJPAs過濾器,我瞭解它應該打開和關閉每個請求的會話,這似乎是視圖模式中的開放會話的本質? – Magnus 2010-10-13 06:34:38

回答

2

幫你一個忙,分開你的應用程序層。視圖中的代碼不應該訪問數據庫。

創建一個服務層和/或Dao層,單元測試這些層的代碼以查看他們正在工作,然後將一個dao或服務對象注入到wicket組件中。 (我建議你使用spring,但你也可以手動)

在你的場景中,有很多不同的東西可能會在一個地方失敗,並且幾乎不可能將它們分開。

這裏有一些指針:

+0

我想你是對的 - 最好是創建一個單獨的應用程序層。 Spring ROO有一些理由放棄了DAO層,但我不記得現在的細節。也許是因爲通常需要將代碼分離出來的代碼與管理的.aj文件已經分離了。似乎ROO正在逐漸脫離我的應用程序。無論如何 - 感謝您的鏈接,我會做更多的閱讀! – Magnus 2010-10-13 06:23:49