我有一个使用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中部署相同的代码时,closeAmount
和lastUpdate
不会更新(数据库中的两个字段都没有获得更新,但是从log这两个字段都可以通过getter返回值)然后显示为null,但在persist()
之前对其他字段的更改在方法完成时生效。所以我打赌当完成WS的方法没有刷新这些领域的变化时。
我认为JPA(无论供应商)应该在persist()
之后保持平衡实体对象的管理,并在方法完成以后的更改后刷新对象。原来,Websphere 7没有成功。即使我放了一个merge()
方法
balance.setCloseAmount(amount);
balance.setLastUpdateTimestamp(now);
balance.merge();
仍然无济于事。
问题:
提前致谢。
答案 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()都不会完成这项工作,但只有上述妥协。仍然不太确定正式的工作......
我会保持这个主题是开放的,因为任何新想法都会进入:)