Apache Wicket,OpenJPA和Spring / ROO

时间:2010-10-12 12:11:21

标签: java wicket spring-roo openjpa

我已经设置了一个Spring ROO应用程序,为OpenJPA设置了持久性并创建了一些实体。 然后我用Apache Wicket取代了Spring MVC。东西似乎工作正常,我已成功显示客户实体列表。

接下来是客户的编辑视图。现在我已经制作了一个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,这可能是我遇到这些问题的原因吗?

非常感谢任何建议!

1 个答案:

答案 0 :(得分:2)

帮自己一个忙,分开你的应用层。视图中的代码不应该访问数据库。

创建一个服务层和/或一个Dao层,对这些层的代码进行单元测试以查看它们是否正常工作,然后将dao或服务对象注入wicket组件。 (我建议你使用spring,但你也可以手动使用它)

根据您的方案,有很多不同的东西可能在一个地方失败,而且几乎不可能将它们分开。

以下是一些提示: