Websphere上的JPA问题 - 在Tomcat上运行正常

时间:2012-09-06 16:00:41

标签: java spring jpa websphere openjpa

我有一个使用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中部署相同的代码时,closeAmountlastUpdate不会更新(数据库中的两个字段都没有获得更新,但是从log这两个字段都可以通过getter返回值)然后显示为null,但在persist()之前对其他字段的更改在方法完成时生效。所以我打赌当完成WS的方法没有刷新这些领域的变化时。

我认为JPA(无论供应商)应该在persist()之后保持平衡实体对象的管理,并在方法完成以后的更改后刷新对象。原来,Websphere 7没有成功。即使我放了一个merge()方法

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

仍然无济于事。

问题:

  1. OpenJPA已作为部署中的依赖项包含在内,但为什么websphere仍需要参与JPA管理?
  2. 如何解决问题?
  3. 提前致谢。

2 个答案:

答案 0 :(得分:1)

我不确定这是否完全回答了您的问题,但我认为您应该进行一些重新配置以使用WebSphere功能,请检查Spring 3.1 documentation

  

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及更高版本。有了这个   适配器,Spring驱动的事务暂停(暂停/恢复为   由PROPAGATION_REQUIRES_NEW发起,由IBM正式支持!

  

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

     

使用正确的PlatformTransactionManager实现   您选择的交易技术和要求。用过的   恰当地说,Spring Framework只提供了一个直截了当的   便携式抽象。如果您正在使用全局事务,则必须   使用org.springframework.transaction.jta.JtaTransactionManager   所有的类(或它的特定于应用程序服务器的子类)   交易操作。否则是交易基础设施   尝试在诸如容器之类的资源上执行本地事务   DataSource实例。这样的本地交易没有意义,并且a   好的应用程序服务器将它们视为错误。

答案 1 :(得分: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()和explicit flush()都不会完成这项工作,但只有上述妥协。仍然不太确定正式的工作......

我会保持这个主题是开放的,因为任何新想法都会进入:)