我已经设置了一个 Spring ROO 应用程序,将持久性设置为 OpenJPA 并创建了一些实体。然后我用 Apache Wicket 替换了 Spring MVC。东西似乎工作正常,我已成功显示客户实体列表。
接下来是客户的编辑视图。现在我已经制作了一个直接使用 OpenJPA 实体作为表单模型的 Wicket 表单,因此我必须让实体类实现 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();
}
这有效,但每个客户对象只有一次。不知何故。也就是说,我提交了一次表单,它同时适用于新客户 (.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:我是否应该使用可拆卸的 Customer 模型创建一个单独的 Wicket IModel,这可能是我遇到这些问题的原因吗?
非常感谢您的任何建议!