2011-06-22 7 views
0

私はExtendedPersistenceContextを使用して、EJB 3とSeamを使用して切り離されたオブジェクトパターンを実装しようとしています。ExtendedPersistenceContextとApplicationExceptionを使用する問題

のデータに基づいてをマージすると、オブジェクトを処理するビジネスルールエンジンもあります。

何かがビジネスルールにうまくいかない場合は、アプリは、特定のEJBと、この質問からによると、

@ApplicationException(ロールバック=真)残念ながら

でマークされた例外を起動しますSO Forcing a transaction to rollback on validation errors in Seamは、注釈によってすべてのオブジェクトが強制的に切り離されるようにします。

基本的に私のオブジェクトは以前と同じ状態です(ユーザーが行った変更が含まれています)が、Detached状態にあるので、ExtendedPersistenceContextを使用してその関係を解決することはできません。

私はAJAXは私もビジネスエンジンに障害が発生した後解決したいことを呼び出し、持っているので、これは、すべての私のページを壊します。

私は再びそれ以外の変更は、DBに反映されますオブジェクトをマージすることはできませんし、ApplicationExceptionをがある場合、私はそれを行うにはしたくありません。

私はビジネスの検証が失敗し、私はそれが拡張永続コンテキストを使用して、その関係を解決できるように、私のオブジェクトは永続的な状態のままにしたい場合は、トランザクションをロールバックします。

提案がありますか?

+0

私はあなたの質問を理解していません。あなたは例外の中で変更やロールバックを行うことを望んでいませんか?達成したいことを説明してください。 –

+0

私はトランザクションをロールバックしたいが、以前と同じようにオブジェクトを使用することができる。 –

+0

@ApplicationException(rollback = true)を使用しているので、ロールバックが自動的に行われます。これは当てはまりませんか?ロールバックでコミットしていますか? –

答えて

0

単一のオブジェクトをデタッチするには、entityManager.detach(object)を使用できます。それ以外の場合は、entityManager.clear()を使用してEntityManagerのすべてのオブジェクトをデタッチできます。

あなたは&例外にロールバックすることを防ぐ行われた変更を維持するために、オブジェクトのクローンを作成することができます。変更は複製されたオブジェクト&で実行され、永続性の前に管理対象オブジェクトに適用されます。

オブジェクトがデタッチされている場合は、entityManager.refresh(object)を実行して&を管理し、それに応じてクローンオブジェクトの変更を適用する必要があります。

関連する問題