我建立了一個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與可拆卸的客戶模型,這可能是我有這些問題的原因嗎?
非常感謝任何建議!
正如請注意,如果你還沒有,請查看Open Session iv View模式,它是i Wicket + Spring中的多重化。這聽起來與你的問題有關,但是我只和Hibernate一起工作,所以我不能制定一個適合你的答案。 – Tim 2010-10-12 12:42:24
嗯,是的 - 可能這是相關的。正如在下面的答案中所述,我應該重新設計應用程序,以便我可以在不同的應用程序級別進行一些測試。我使用OpenJPAs過濾器,我瞭解它應該打開和關閉每個請求的會話,這似乎是視圖模式中的開放會話的本質? – Magnus 2010-10-13 06:34:38