4

Tapestry5(java webframework)とHibernateで作成されたWebアプリケーションがあります。今、私は楽観的ロックを追加しようとしています。そこで、バージョン属性を追加し、楽観的ロックが機能するようにしたので、それは簡単で高速でした。

しかし、私のWebアプリケーションは「要求ごとのセッション」パターンで動作するため、この楽観的ロックを利用するための最良の方法がわかりません。

何が起こるのですか:

UserAは、entityA(バージョン1)からの値がロードされたフォームでページを開きます。

UserBは、entityA(バージョン1)からの値がロードされたフォームでページを開きます。

UserAはいくつかの値を変更し、フォームを送信します。->新しいリクエストはentityA(バージョン1)を取得し、変更をコミットします(entityAはバージョン2になりました)

UserBはいくつかの値を変更し、フォームを送信します。->新しいリクエストはentityA(バージョン2)を取得し、変更をコミットします(entityAはバージョン3になりました)

何が起こるべきか

UserBの変更はコミットしないでください。ただし、リクエストごとのセッションパターンのため、Hibernateの楽観的ロックエラーが発生する可能性のある時間枠は、送信からコミットまでの新しいリクエストからの期間に短縮されます。これは望ましい結果ではありません。

可能な解決策

いくつかの調査の後、私は次のことを発見しました:

  • エンティティバージョンを使用してフォームに非表示フィールドを追加します

この値を使用して、コミット前にエンティティのバージョンを設定できますが、Hibernateのドキュメントではこの値の設定を推奨していません。また、エンティティがデタッチされて再接続された場合にのみ機能します。それ以外の場合、手動で設定されたバージョン値はHibernateによって無視されるためです。

次に、このバージョン値を使用して、フォームがレンダリングされたときのバージョンが、送信時にリクエストにロードされたエンティティのバージョンと同じであるかどうかを手動で確認できます。次に、必要に応じて自分でOptimisticLockingExceptionをスローします。

  • デタッチされたエンティティをHttpSessionに配置するので、送信時に再度ロードする必要はありません。

結論

これらの方法は機能しますが、私にはあまり実用的ではなく、間違いを犯しやすいようです。だから私は他の人がこの問題をどのように実装しているのだろうかと思っています。

4

2 に答える 2

1

私は次のことを実装することになりました:

  • エンティティバージョンを使用してフォームに非表示フィールドを追加します
  • フォームdtoオブジェクトの使用
  • これらのdtoオブジェクトをhttpsessionにアタッチする(複数のリクエストにわたる会話状態)
  • dtoと実際のオブジェクト間の手動バージョンチェック
于 2013-02-18T16:40:20.507 に答える
0

永続エンティティをWebレイヤーに転送するためだけにデタッチする場合、例として、オブジェクトをWebレイヤーに転送するためのDTOを作成します。その場合、ゲッターとセッターを使用してエンティティオブジェクトをDTOオブジェクトに変換します。

Optimisticロックを使用して同時実行制御を維持する必要がある場合は、アプリケーションでバージョン番号を維持する必要があります(バージョン番号を手動で設定する場合とは異なります)。そうしないと、ロードされたレコードの古いバージョンが何であったかを休止状態に指示する方法がありません。Hibernateのドキュメントには、「切断されたセッションを永続層の近くに保持します。EJBステートフルセッションBeanを使用して、セッションを3層環境に保持します。Web層に転送したり、別の層にシリアル化したりしないでください。 、HttpSessionに格納します。 "、しかし、すべての環境で、ビジネス層にEJBステートフルセッションBeanがありません。その場合、バージョン番号を維持する必要があります。

バージョンを維持できる限り、プログラムでバージョンを手動でチェックする必要はありません。オブジェクト階層の深さを予測できないため、休止状態にチェックさせると効率的です。

したがって、Webレイヤーでデタッチされたオブジェクトを使用する場合は、バージョンを永続エンティティに再度設定する必要があります。そうすると、hibernateが同時実行制御を処理します。

于 2012-12-15T05:05:13.483 に答える