2

我有一个使用 openJPA 作为持久性管理的 Spring 3 应用程序,以下部分在 STS/Tomcat 中运行良好

@Transactional
createBalance(){
.....
    Balance balance = new SummaryBalance();
    balance.setName(name);
    balance.setCurrency(currency);
    balance.setClosingTimestamp(closingTime);
    balance.setStatus(BalanceStatus.OPEN);
    balance.persist(); // persist !!
 ......

    balance.setCloseAmount(amount);
    balance.setLastUpdateTimestamp(now);
}

但是,当在 websphere 7 中部署相同的代码时,closeAmountandlastUpdate不会更新(DB 中的两个字段都没有得到更新,但从日志中两个字段都可以通过它们的 getter 返回值)然后显示为 null,但之前更改为其他persist()字段方法完成后生效。所以我敢打赌,当完成 WS 的方法没有刷新这些字段的更改时。

我认为 JPA(无论供应商如何)应该保持平衡实体对象的管理,persist()并在方法完成后刷新对象并进行后续更改。事实证明 Websphere 7 没有成功。甚至我放了一个merge()方法

    balance.setCloseAmount(amount);
    balance.setLastUpdateTimestamp(now);
    balance.merge();

仍然没有帮助。

问题:

  1. OpenJPA 已经作为依赖项包含在部署中,但是为什么 websphere 还需要参与 JPA 管理呢?
  2. 如何解决问题?

提前致谢。

4

2 回答 2

1

我不确定这是否能准确回答您的问题,但我认为您应该重新配置以使用 WebSphere 功能,请查看Spring 3.1 文档

11.8.1 IBM WebSphere

在 WebSphere 6.1.0.9 及更高版本上,推荐使用的 Spring JTA 事务管理器是 WebSphereUowTransactionManager。这个特殊的适配器利用 IBM 的 UOWManager API,它在 WebSphere Application Server 6.0.2.19 及更高版本和 6.1.0.9 及更高版本中可用。有了这个适配器,IBM 正式支持 Spring 驱动的事务暂停(由 PROPAGATION_REQUIRES_NEW 发起的暂停/恢复)!

11.9.1 对特定数据源使用错误的事务管理器

根据您选择的事务技术和要求使用正确的 PlatformTransactionManager 实现。如果使用得当,Spring 框架仅仅提供了一个简单且可移植的抽象。如果您使用全局事务,则必须使用 org.springframework.transaction.jta.JtaTransactionManager 类(或它的特定于应用程序服务器的子类)进行所有事务操作。否则,事务基础结构会尝试对容器 DataSource 实例等资源执行本地事务。这样的本地事务没有意义,一个好的应用服务器会将它们视为错误。

于 2012-09-06T16:35:06.610 回答
0

通过猜测工作自己找出解决方案。只需将persist() 放在整个方法体的末尾即可。

@Transactional
createBalance(){
.....
    Balance balance = new SummaryBalance();
    balance.setName(name);
    balance.setCurrency(currency);
    balance.setClosingTimestamp(closingTime);
    balance.setStatus(BalanceStatus.OPEN);
 ......

    balance.setCloseAmount(amount);
    balance.setLastUpdateTimestamp(now);
 ......
    balance.persist(); // persist !!
}

这可以确保在方法完成之前设置每个字段。merge() 和显式 flush() 都不能完成这项工作,但只能在上述妥协的情况下完成。仍然不太确定官方的解决方法....

我会保持这个线程开放,以便有任何新的想法进来:)

于 2012-09-12T02:39:03.477 回答