JPA持続性コンテキスト


永続性コンテキストとは?


エンティティを永続的に保存する環境.通常はオブジェクト単位で作成され、オブジェクトが終了すると消去されます.
entityManager.persist(entity); --> エンティティーマネージャによる永続性コンテキストへのアクセス

エンティティのライフサイクル


•非永続性(new/transient)
영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 
•永続(管理)
영속성 컨텍스트에 관리되는 상태 
transaction을 commit하는 시점에  query가 발생한다.
•準零速(分離)
영속성 컨텍스트에 저장되었다가 분리된 상태 
•削除
삭제된 상태

永続性コンテキストの利点


•メインキャッシュ
dbクエリーの前にメインキャッシュで検証します.永続的コンテキストが永続的な状態にある瞬間にキャッシュを使用するため、パフォーマンスの向上効果は望ましくありません.
•一貫性の確保
アプリケーション・レベルで、データベースにロードされたオブジェクトの一貫性を確保します.同じオブジェクトにおいて、DBは生成されたオブジェクトの値==を比較したときと同じ値を読み込みます.(Javaで同じデータから2つのオブジェクトを作成するアドレス値は異なるので==比較では異なる)
•書き込み遅延によるトランザクションのサポート
クエリー・リクエストをトランザクションからコミット・ポイントに延期します.
   (transactional write-behind)
•変更の検出
永続性エンティティのクエリーが完了した後、データの変更時にデータをコミットすると、flush()が呼び出されたエンティティと、エンティティが最初に読み込まれたときに生成されたスナップショットが比較されます.変更が発生した場合、update sqlは永続性コンテキストの内部で発生した後にコミットされます.
•遅延ロード

レリーフ


永続性コンテキストの変更をデータベースに反映します.永続性コンテキストを空にするのではなく、内部変更をDBに同期するため、トランザクション・ワークセルがコミットされる前に同期すると理解できます.
リフレッシュが発生すると、

  • 変更の検出

  • 変更されたエンティティのSQLリポジトリへの書込み遅延登録

  • 書き込み遅延データベースへのクエリーの送信(登録、変更、削除)

  • メインキャッシュはすべて保持されます.
  • リフレッシュ方法
    •em.flush()-ダイレクトコール
    •トランザクションのコミット-リフレッシュの自動呼び出し
    •JPQLクエリーの実行-リフレッシュの自動呼び出し
    リフレッシュ・モード・オプション
    • FlushModeType.AUTO
    커밋이나 쿼리를 실행할 때 플러시 (기본값) 
    • FlushModeType.COMMIT
    커밋할 때만 플러시

    じゅんたいきゅうじょうたい


    永続状態のエンティティは永続コンテキストから分離され、永続コンテキストが提供する機能は使用できません.
    準永久状態にする方法
    • em.detach(entity)
    특정 엔티티만 준영속 상태로 전환 
    • em.clear()
    영속성 컨텍스트를 완전히 초기화 
    • em.close()
    영속성 컨텍스트를 종료