【问题标题】:Apache Wicket, OpenJPA and Spring/ROOApache Wicket、OpenJPA 和 Spring/ROO
【发布时间】:2010-10-12 12:11:21
【问题描述】:

我已经设置了一个 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 方面:我是否应该使用可拆卸的 Customer 模型创建一个单独的 Wicket IModel,这可能是我遇到这些问题的原因吗?

非常感谢您的任何建议!

【问题讨论】:

  • 请注意,如果您还没有,请查看 Open Session iv View 模式及其在 Wicket + Spring 中的实现。这听起来与您的问题有关,但我已经仅与 Hibernate 一起使用,因此我无法制定适合您的答案..
  • 嗯,是的 - 可能是相关的。正如下面的答案所述,我真的应该重新设计应用程序,以便可以在不同的应用程序级别进行一些测试。我正在使用 OpenJPA 过滤器,我理解它应该为每个请求打开和关闭一个会话,这似乎是 Open Session in View 模式的本质?

标签: java wicket spring-roo openjpa


【解决方案1】:

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

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

在您的场景中,有很多不同的事情可能会在一个地方失败,并且几乎不可能将它们分开。

这里有一些提示:

【讨论】:

  • 我想你是对的——最好创建一个单独的应用层。 Spring ROO 有一些关于删除 DAO 层的推理,但我现在不记得细节了。也许是因为通常需要分离出来的代码已经与托管的 .aj 文件分开了。似乎 ROO 正在逐步退出我的应用程序。无论如何-感谢您的链接,我会做更多的阅读!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-28
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多