0

Hibernate を使用する前は、Process スコープの ID環境で作業する贅沢がありました。つまり、データベースから同じオブジェクトを 2 回フェッチすると、常に == になります。

hibernate に移行する前はHashMap、一意のインスタンスを保持することでこれを実現していました。結果セットをフェッチするたびに、同じオブジェクト インスタンスを返すために、このマップ内の以前のインスタンスをチェックしました。WeakReferenceメモリ リークを回避し、ガベージ コレクターを支援するために、マップに配置する前に、まずこれらの一意のインスタンスをオブジェクトでラップします。

私は (この 10 年前のフレームワークから) 休止状態に移行して、最新の Java テクノロジを最新の状態に保つようにしました。そして、私は、休止状態がすぐに使える状態でこれをサポートするだろうと誤って想定しました。もちろん、独自のキャッシングを再度実装したくなります。しかし、私の目標は、最小限の自己記述コードでプロジェクトのコアをセットアップすることです。

実際、ほとんどの Web サイトは、プロセス スコープ IDをまったく使用しないように説得しようとしています。正直なところ、私は少し懐疑的ですが、なんとかなると確信しています。

現在、process-scoped-identity を背後に置くことを検討していますが、多くの結果があるようです。例: 以前は一時的なフィールドに (実行時に計算された) 情報を保存することがありました。もちろん、これは今では不可能です。

一部の Web サイトでは、EHCache フレームワークを使用してProcess スコープの IDに到達できると書いています。試しましたが、まだ成功していません。デフォルトでは明らかにオフになっており、有効にする方法の例は見つかりませんでした.

いくつかのアドバイスは大歓迎です。

編集:(より具体的に)

  • Process Scoped IdentityHibernate を使用するときに達成することは可能ですか?
  • もしそうなら、それは良い習慣ですか、それはどのように達成できますか?
4

1 に答える 1

3

実際、実装したものはそのままでサポートされており、特定の Hibernate session でHibernate によってサポートされています。

複数のセッション (およびトランザクション) 間で一意のインスタンスを共有しても意味がありません。トランザクションによって提供される ACID 機能が損なわれ、1 人のユーザーのみがデータベースにアクセスしない限り、完全に役に立たなくなるからです。たとえば、メモリに保存されている一時的なフィールドは、この一意のメモリ内インスタンスを経由せずにデータベースでデータが変更されている場合、完全に正しくありません。また、何らかの制約が壊れてトランザクションのロールバックが発生した場合、データベースに格納されているデータの現実から完全に切り離された、一意のインスタンス内に誤った値が残ります。

于 2013-08-11T12:49:11.873 に答える