Apache检票口,OpenJPA和Spring/Roo
-
29-09-2019 - |
题
我已经设置了一个Spring Roo应用程序,将持久性设置为OpenJPA并创建了一些实体。然后,我用Apache检票口替换了Spring MVC。东西似乎工作正常,我已经成功显示了客户实体列表。
接下来是客户的编辑视图。目前,我制作了一个检票口表单,该表格直接将OpenJPA实体用作表单模型,因此我必须使实体类实现可序列化。
现在,我不确定如何正确实施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的正确方法是什么?为什么我会遇到这个错误?
检票口:我应该用可拆卸的客户模型创建一个单独的检票口imodel,这可能是我遇到这些问题的原因吗?
感谢您提供的任何建议!
解决方案
帮自己一个忙,分开应用层。视图中的代码不应访问数据库。
创建服务层和 /或DAO层,单元测试这些层的代码,以查看它们正在工作,然后将DAO或服务对象注入检票口组件。 (我建议您为此使用Spring,但您也可以手动进行)
在您的情况下,有很多不同的事情可能会在一个地方失败,几乎不可能将它们分开。
这是一些指示:
- 道 (J2EE模式)
- 商业逻辑 (维基百科)
- 检票口 /春季 /休眠配置 (JPA非常相似)
- JPA使用春季
不隶属于 StackOverflow