2

永続性管理としてopenJPAを使用するSpring3アプリケーションがあります。次のセクションは、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の両方のフィールドは更新されませんでしたが、ログから両方のフィールドがゲッターによって値を返すことができます)、nullとして表示されますが、実行する前に他のフィールドに変更されpersist()ますメソッドが終了すると有効になります。したがって、WSを終了するメソッドがこれらのフィールドに向けて変更をフラッシュしなかった場合は間違いありません。

JPA(ベンダーに関係なく)は、バランスエンティティオブジェクトを管理し続けpersist()、メソッドが後で変更を加えて終了した後にオブジェクトをフラッシュする必要があると思いました。Websphere7ではうまくいかないことがわかりました。merge()方法を入れても

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

それでも役に立たない。

質問:

  1. OpenJPAはすでにデプロイメントに依存関係として含まれていますが、それでもWebsphereがJPA管理に関与する必要があるのはなぜですか?
  2. 問題を解決する方法は?

前もって感謝します。

4

2 に答える 2

1

これがあなたの質問に正確に答えるかどうかはわかりませんが、WebSphereの機能を使用するには再構成を行う必要があると思います。Spring3.1のドキュメントを確認してください。

11.8.1 IBM WebSphere

WebSphere 6.1.0.9以降では、使用することが推奨されるSpringJTAトランザクションマネージャーはWebSphereUowTransactionManagerです。この特別なアダプターは、WebSphere ApplicationServer6.0.2.19以降および6.1.0.9以降で使用可能なIBMのUOWManagerAPIを利用します。このアダプターを使用すると、Spring駆動型のトランザクションの一時停止(PROPAGATION_REQUIRES_NEWによって開始された一時停止/再開)がIBMによって正式にサポートされます。

11.9.1特定のデータソースに対する間違ったトランザクションマネージャーの使用

トランザクションテクノロジーと要件の選択に基づいて、正しいPlatformTransactionManager実装を使用してください。適切に使用すると、SpringFrameworkは単純で移植可能な抽象化を提供するだけです。グローバルトランザクションを使用している場合は、すべてのトランザクション操作に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 に答える