JPA(Java Persistence API)?


JPA(Java Persistence API)?


SQLを中心とした開発の問題点

  • 重複するSQLとコードの無限重複性を記述する
  • SQL開発依存
  • 本当の意味での階層区分は難しい.
  • 実体が信用できない
  • オブジェクトとリレーショナル・データベースの違い

  • 継承
    オブジェクトには継承関係があり、リレーショナル・データベースには継承関係がありません.
  • 関連関係
    オブジェクトには参照があります(参照).//関連オブジェクトをgetterにインポートできます.
    リレーショナル・データベースは、PKまたはFKを使用してjoinを行い、必要なデータを検索できます.
  • データ型
  • データ認識方法
  • この違いはパターンの相違をもたらした.この違いを克服するために、開発者は時間とコードを費やしすぎ、オブジェクト向けのモデリングはパターンの不一致の問題をますます深刻にします.このため、JPAは徐々にデータ中心のモデルに移行し、この問題を解決し、正確なオブジェクトモデリングを維持するのに役立ちます.

    JPA

  • Java Persistence API
  • ジャワ陣営のORM技術標準
  • ORM

  • オブジェクト-リレーションシップマッピング(オブジェクトリレーションシップマッピング)
  • 対象別デザイン
  • リレーショナル・データベース別設計
  • ORMフレーム中央マッピング
  • 大衆言語にはORM技術が多く存在する
  • 従来のJDBC APIとSQL中心の動作



    JPAのアプリケーションとJDBC間の動作



    JavaアプリケーションコマンドJPAは、JDBC APIを使用してSQLを作成し、DBに送信します.

    JPA動作-保存


    jpa.persist(member); // 저장
  • メンバーオブジェクトをJPA、JPA分析オブジェクト
  • INSERT query生成(JPA作成query)
  • JPAがJDBC APIを使用してINSERT queryをDBに送信
  • パラドックスの分岐を解決
  • JPAアクション-ブラウズ


    Member member = jpa.find(memberId); // 조회
  • JPAはPK値findリクエスト
  • JPA生成SELECT query
  • JDBC API経由でデータベースに送信して結果を受信
  • ResultSetマッピング
  • パターン不一致解決
  • なぜJPAを使うのですか?


    せいさんこうりつ


    開発者は冗長で重複したコードやCRUD用のSQLを書く必要はなく、JPAはDDL文を自動的に生成する機能も備えている.例えばCREATE TABLECRUDの定義は以下の通りです://コードはJavaの集合フレームワークのように簡潔です.
  • 貯蔵:jpa.persist(member)
  • 照会:Member member = jpa.find(memberId)
  • 修正:member.setName("변경할 이름")
  • 削除:jpa.remove(member)
  • メンテナンス


    以前は、フィールドを変更するときにすべてのSQLを変更する必要がありました.たとえば、フィールドを追加した場合は、そのフィールドを使用するすべての場所を変更する必要があります.
    JPAではフィールドを追加するだけです.SQLはJPAで処理されます.

    JPAとサンプルの不一致の解決

  • JPAと相続
  • JPAの関連関係
  • JPAとオブジェクトグラフィックナビゲーション
  • JPAと比較
  • JPAに引き継ぐ



  • ちょぞうjpa.persist(album);命令後、JPAは自己処理する.JPAはpersist命令を受け,ITEMテーブルとALBUMテーブルともにINSERTクエリを発行する.

  • 朝礼jpa.find(Album.class, albumId);は、JPAが自己処理する.JPAはItemとAlbumに参加してみんなを探しに来ました

  • JPAとの関連付け、オブジェクト図面の参照
  • // 연관관계 저장
    member.setTeam(team);
    jpa.persist(member);
    // 객체 그래프 탐색
    Member member = jpa.find(Member.class, memberId);
    Team team = member.getTeam(); // 자유로운 객체 그래프 탐색
    関連関係を保存し、インポート時にjava collectionのように取り出すことができます.

    JPAとの比較

    String memberId = "100";
    Member member1 = jpa.find(Member.class, memberId);
    Member member2 = jpa.find(Member.class, memberId);
    if (member1 == member2) return true; // 결과는 같다.
    else return false;
    同じトランザクションでクエリーされたエンティティは同じであることを保証します.
    (メインキャッシュを使用するため)

    JPAおよびパフォーマンス最適化機能


    1.メインキャッシュと一致することを確認

  • 同じ取引で同じエンティティを返す-クエリーのパフォーマンスが若干向上
  • DB IsolationレベルはRead Commitですが、アプリケーションはRepeatable Readを使用できます.
  • String memberId = "100";
    Member m1 = jpa.find(Member.class, memberId); // SQL
    Member m2 = jpa.find(Member.class, memberId); // 캐시
    println(m1 == m2) // true
    上記のコードでは、SQLは1回のみ実行されます.

    2.取引をサポートする書き込み遅延-INSERT

  • INSERT SQLをトランザクションのコミットまで収集
  • JDBC BATCH SQL機能でSQLを一括送信
  • transaction.begin(); // 트랜잭션 시작
    em.persist(memberA);
    em.persist(memberB);
    em.persist(memberC);
    // 여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.
    // 커밋하는 순간 데이터베이스에 INSERT SQL을 모아서 보낸다.
    transaction.commit(); // 트랜잭션 커밋

    3.遅延ロードとインスタントロード

  • 遅延ロード:実際にオブジェクトを使用した場合にロード
  • 即時ロード:JOIN SQLを使用して一度関連するオブジェクトを事前に問い合わせる
  • // 지연 로딩
    Member member = memberDAO.find(memberId); // SELECT * FROM MEMBER
    Team team = member.getTeam();
    String teamName = team.getName(); // SELECT * FROM TEAM
    // 즉시 로딩
    Member member = memberDAO.find(memberId); // SELECT M.*, T.* FROM MEMBER JOIN TEAM ...
    Team team = member.getTeam();
    String teamName = team.getName();
    遅延ロードは、メンバーのクエリー時にメンバーのみを取得します.
    そして3列目はチームgetNameの場合、JPAはDBにTeamに対するqueryを発行して取得する.
    つまり、必要に応じてクエリーを発行して値を取得します.
    インスタントロードは、メンバーをクエリーすると、メンバーに関連付けられたすべてのオブジェクトがインポートされます.
    メンバーをインポートする場合は、メンバーのみを使用すると、遅延ロードがよりよくなります.メンバーとともに関連オブジェクトを使用する場合は、すぐにロードしたほうがいいです.

    詳細

  • JPA、HibernateとSpring Data JPAの違い
  • References

  • 金英漢のJava ORM標準JPAプログラミング-基本編(基礎)
  • Java ORM標準JPAプログラミング-基本編