Java ApacheWicket、OpenJPA和Spring/ROO

Java ApacheWicket、OpenJPA和Spring/ROO,java,wicket,spring-roo,openjpa,Java,Wicket,Spring Roo,Openjpa,我已经设置了一个SpringRoo应用程序,将持久性设置为OpenJPA,并创建了一些实体。 然后我用ApacheWicket替换了SpringMVC。这些东西似乎运行良好,我已经成功地显示了一个客户实体列表 接下来是客户的编辑视图。现在我已经制作了一个Wicket表单,它直接使用OpenJPA实体作为表单模型,因此我必须使实体类实现可序列化 现在,我不确定如何正确实现OpenJPA持久性,我现在得到的是: @Override protected void onSubmit() { tr

我已经设置了一个SpringRoo应用程序,将持久性设置为OpenJPA,并创建了一些实体。 然后我用ApacheWicket替换了SpringMVC。这些东西似乎运行良好,我已经成功地显示了一个客户实体列表

接下来是客户的编辑视图。现在我已经制作了一个Wicket表单,它直接使用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())。但是,我再次提交了该表单,因为我遇到了此错误(我在此处添加了一些换行符):


org.apache.openjpa.persistence.OptimisticLockException:
将对象实例“no.magge.iumb.domain.crm.PrivateCustomer-379”刷新到数据存储时检测到乐观锁冲突。
这表示该对象在另一个事务中同时被修改。
我的问题是,坚持使用OpenJPA的正确方法是什么?为什么会出现这种错误

Wicket wise:我应该创建一个单独的Wicket IModel和一个可分离的客户模型吗?这可能是我出现这些问题的原因吗


谢谢你的建议

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

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

在您的场景中,有太多不同的东西可能会在一个位置失败,几乎不可能将它们分开

以下是一些要点:

  • (J2ee模式)
  • (维基百科)
  • (这与JPA非常相似)

请注意,如果您还没有,请查看OpenSessionIV视图模式及其在Wicket+Spring中的实现。。这听起来和你的问题有关,但我只和Hibernate一起工作过,所以我无法给出一个对你有用的答案..嗯,是的-可能这是相关的。如下面的回答所述,我应该重新设计应用程序,以便在不同的应用程序级别进行测试。我使用的是OpenJPAs过滤器,据我所知,它应该为每个请求打开和关闭一个会话,这似乎是视图模式中打开会话的本质?我想你是对的,最好创建一个单独的应用程序层。SpringRoo有一些关于删除DAO层的理由,但是我现在不记得细节了。可能是因为通常需要分离的代码已经与托管的.aj文件分离。看起来ROO一部分一部分地从我的应用程序中消失了。无论如何-谢谢你的链接,我会做更多的阅读!
<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.