我已经设置了Spring ROO应用程序,将持久性设置为OpenJPA并创建了一些实体。
然后,我用Apache Wicket替换了Spring MVC。东西似乎运行良好,并且我已经成功显示了Customer实体的列表。
接下来是客户的编辑视图。现在,我制作了一个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:我是否应该使用可分离的Customer模型创建一个单独的Wicket IModel,这可能是我遇到这些问题的原因吗?
感谢您的任何建议!
最佳答案
帮个忙,分离您的应用程序层。视图中的代码不应访问数据库。
创建一个Service层和/或Dao层,对这些层的代码进行单元测试以查看它们是否在工作,然后将dao或service对象注入到wicket组件中。 (我建议您使用spring,但也可以手动进行)
对于您的方案,有很多不同的事情可能在一处失败,并且几乎不可能将它们分开。
这里有一些指针:
Dao(J2ee模式)
Business logic(维基百科)
Wicket / Spring / HibernateConfiguration(与JPA非常相似)
JPA using Spring
关于java - Apache Wicket,OpenJPA和Spring/ROO,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3914502/