[英]Application is not starting in websphere 8.5.5 but works fine in tomcat
[英]JPA issue on Websphere — works fine on Tomcat
我有一個使用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
不會更新(DB中的兩個字段都未獲取更新,但是從日志中,兩個字段都可以通過其getter返回值),然后顯示為null,但是對其他字段進行了更改在persist()
之前,該方法完成后才生效。 因此,我敢打賭,當完成WS的方法沒有將更改刷新到這些字段時。
我認為JPA(不論供應商如何)都應在persist()
之后保持對余額實體對象的管理,並在方法完成以后的更改之后刷新對象。 事實證明,Websphere 7無法做到這一點。 即使我放了merge()
方法
balance.setCloseAmount(amount);
balance.setLastUpdateTimestamp(now);
balance.merge();
仍然沒有幫助。
問題:
提前致謝。
我不確定這是否能回答您的問題,但是我認為您應該重新配置以使用WebSphere功能,請查看Spring 3.1文檔。
11.8.1 IBM WebSphere
在WebSphere 6.1.0.9及更高版本上,推薦使用的Spring JTA事務管理器是WebSphereUowTransactionManager。 這個特殊的適配器利用了IBM的UOWManager API,該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實例)執行本地事務。 這樣的本地事務是沒有意義的,好的應用服務器會將它們視為錯誤。
自己通過猜測工作找出解決方案。 只需將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()都不會完成這項工作,而只會做出上述妥協。 仍然不太確定官方的解決方法。
對於任何新的想法,我都會保持開放狀態:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.