私は、Java永続性とHibernateに関する書籍を参照しています。ダーティチェックのためにHibernateが使用する「状態スナップショット」
(参照:https://www.manning.com/books/java-persistence-with-hibernate-second-edition)。
「状態スナップショット」は、汚れチェックのために使用されています。
参照:
永続コンテキストキャッシュは自動的に縮小したことがありません。永続コンテキストのサイズを必要最小限に抑えてください。多くの場合、いくつかのアイテムしか必要としなかったが、多数の質問があったため、多くの場合 の永続インスタンスがコンテキスト内に存在します( の例)。 非常に大きなグラフはパフォーマンスに重大な影響を与える可能性があり、 には状態スナップショットに大きなメモリが必要です。 クエリが必要なデータだけを返すことを確認し、次の方法で がHibernateのキャッシュ動作を制御することを検討してください。
永続コンテキストから永続インスタンス を手動で削除するには、EntityManager#detach(i)を呼び出すことができます。 EntityManager#clear()を呼び出してすべての永続エンティティインスタンスをデタッチすると、 は空の永続コンテキストを残します。
ネイティブセッションAPIには、 という便利な機能があります。永続コンテキスト全体を読み取り専用モードに設定できます。 これは、状態のスナップショットとダーティチェックを無効にし、データベースへのHibernateがうない 書き込みの修正:
em.unwrap(Session.class).setDefaultReadOnly(true);
Item item = em.find(Item.class, ITEM_ID);
item.setName("New Name");
em.flush();
私の質問したがって、あります:
上記に言及
@Entity
のクラスからHibernateがを作成したオブジェクトプロキシと状態のスナップショットの違いは何ですか?州のスナップショットに関する詳細な資料はどこにありますか?
編集は:Session#setDefaultReadOnly
変更し、このセッション にロードされたエンティティとプロキシのデフォルト:アカウントNarosの答えを考慮して、私は、SessionクラスのHibernateのドキュメント内の非常に興味深い情報を見つけました変更可能なモードから読み取り専用モードへ、または変更可能なモードから読み取り専用の モードに変更できます。読み取り専用エンティティはダーティチェックされず、 永続状態のスナップショットは維持されません。読み取り専用エンティティは に変更できますが、変更は保持されません。プロキシが初期化されると、セッションの現在の の設定に関係なく、読み込まれたエンティティは と同じ読み取り専用/変更可能な設定となります(初期化されていないプロキシが持つ)。 ここでは、このセッションで
をすでにある特定の エンティティまたはプロキシの読み取り専用/修正設定を変更するには、リンクである:https://docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/Session.html#setDefaultReadOnly-boolean-
ありがとうNaros。状態スナップショットの管理を担当するハイバーネイトクラスのソースコードについて、あなたが説明したこと、あるいはそれ以上のことを言及しているドキュメンテーションの関連部分を教えていただけますか? – balteo
こんにちはナロス。私はドキュメントを見つけ、それに応じて私の投稿を編集しました。州のスナップショットに関連するソースコードへのリンクはあなたから素晴らしいでしょう! – balteo