Java ORM標準JPAプログラミング-ネイティブ#1 JPA概要-最初


Java ORM標準JPAプログラミング-基本編


この文章は学習金英漢のInfolearn講座の内容をまとめた.
Java Spring開発では、ORMとしてJPAを使用することが多い.
私が使っているのは流行のテクノロジースタックで、問題解決のために検索しやすいなどです.
先に使うと決めた以上.
  • JPAが解決した問題は何ですか、
  • を使うメリットは何ですか?
  • を正しく使用する方法
    知っておくべきだと思って勉強を始めました

    n/a.ターゲット


    この記事では、SQLを中心とした開発における問題点と、オブジェクトとリレーショナル・データベースの違いについて説明します.
    次に、JPAが上記の違いによる問題をどのように解決しているのかを簡単に理解します.

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


    発生した問題

  • CRUDクエリーを作成し、
  • の変更を無限に繰り返す
  • Javaオブジェクト

    JPAでCRUDを作成し、オブジェクト-SQLを解決


    JPAを使用すると、オブジェクトのCRUD SQLを直接作成するのではなく、JPAが提供するAPIを使用できます.
    JPAは、オブジェクトのマッピング情報を表示し、適切なSQLを生成、実行し、オブジェクトを返します.

    パターンの相違


    オブジェクトとリレーショナル・データベースの違いは次のとおりです.
  • 継承
  • 関連
  • オブジェクトグラフィックナビゲーション
  • これらの違いがもたらす問題と、JPAを通じてこれらの問題をどのように解決するかを理解してみましょう.

    継承


    オブジェクトには継承関係が明確に存在します.
    RDBにはスーパータイプ-サブタイプ関係がある.(これは継承ではなく継承に似た概念です.)
    対象を導く継承とERDで表現した例を下図に示す.

    発生した問題


    Albumオブジェクトを保存する方法を考えてみましょう.
  • AlbumオブジェクトをAlbumとItem
  • に分解
    作成
  • INSERT INTO項目
  • INSERT INTOアルバム
  • を作成
    そしてAlbumを調べるにはどうすればいいか考えてみましょう.
  • Item、Albumテーブルの結合SQL
  • を作成
    各オブジェクト作成
  • Item-Movie、Item-Bookに対しても同様の仕事をしなければならない.

    JPAによる継承問題の解決


    子タイプを保存すると、JPAは親タイプ、子タイプに対応したINSERTを実行し、2つのテーブルに分割します.
    クエリー時に必要なテーブルが結合され、クエリーが返されます.

    関連関係


    オブジェクトは参照を使用して他のオブジェクトと関係を確立します.
    テーブルは外部キーを使用して他のテーブルと関係を確立します.
    画像で次のように表現します.

    発生した問題


    問題は、テーブルを中心としている場合や、オブジェクトをガイドとしている場合に発生します.
    まず、表を中心にモデリングを行う場合を見てみましょう.

    表の中心のモデリング


    テーブルは、外部キー列を使用してテーブル間の関係を確立します.
    これをコードとして次のように書きます.
    class Member {
      String id;       //MEMBER_ID 컬럼
      Long teamId;     //TEAM_ID 컬럼 (FK)
      String username; //USERNAME 컬럼
    }
    class Team {
      Long id;     //TEAM_ID 컬럼 (PK)
      String name; //NAME 컬럼 
    }
    このモデリングの利点は、テーブルに格納またはクエリーするときにオブジェクトフィールドを直接使用できるため、非常に便利です.
    欠点はメンバーからチームへのオブジェクト参照がないことです.
    したがって,member.getTeam()によるオブジェクトマップ探索はできない.

    オブジェクト向けモデリング


    オブジェクトは参照によって関係を確立します.
    これをコードとして次のように書きます.
    class Member {
      String id;       //MEMBER_ID 컬럼
      Team team;       //참조로 연관관계를 맺는다.
      String username; //USERNAME 컬럼
      
      Team getTeam() {...}
    }
    class Team {
      Long id;     //TEAM_ID 컬럼 (PK)
      String name; //NAME 컬럼 
    }
    オブジェクト向けモデリングの利点は、オブジェクト参照があり、member.getTeam()で参照できることです.
    欠点は、SQL変換を追加してオブジェクトを格納することです.

    JPAによる関連の解決


    JPAは、リレーションシップを確立しているオブジェクト参照を外部キーに変換し、INSERT SQLを自分で作成し、クエリー時に外部キーを参照に変換する点もJPAが処理します.

    オブジェクトグラフィックスの参照


    オブジェクトでメンバーが属するチームをクエリーする場合は、参照を使用して関連チームを検索できます.
    これをオブジェクトグラフィックブラウズと呼びます.Team team = member.getTeam();オブジェクト関連関係は次のように設計されていると仮定します.

    次に、メンバーオブジェクトから開始し、別の接続オブジェクトを選択する場合は、次の方法を使用します.member.getOrder().getOrderItem()...

    発生した問題


    SQLを直接使用する場合は、最初に実行したSQLに基づいてオブジェクト図面の参照範囲を指定できます.
    次のSQLでオブジェクトを問い合わせると、member.getTeam()は成功しますが、他のオブジェクトは参照できません.
    SELECT m.*, t.*  
      FROM Member m
      JOIN Team t ON m.teamId = t.id;

    JPAによるオブジェクトグラフィックナビゲーションの解決


    JPAは、データベースクエリを実際のオブジェクトを使用する時点まで遅らせることができます.
    これを遅延ロードと呼びます.

    比較


    データベースは、各ローをプライマリ・キーの値で区切ります.
    逆に、オブジェクトには2つの比較方法があります.同じ比較と等しい比較です.
  • 同一性比較
    これは==を用いた比較である.オブジェクトインスタンスのアドレス値を比較します.
  • 同等性能比較
    これはequals()法による比較である.オブジェクトの内部の値を比較します.
  • このため、表の線とオブジェクトの間に差があります.

    発生した問題


    同じ鍵を持つメンバーをクエリーする例について説明します.
    class MemberDAO {
      public Member getMember(String memberId) {
        String sql = "SELECT * FROM MEMBER WHERE MEMBER_ID = ?";
        ... // JDBC API, SQL 실행
        return new Member(...);
      }
    }
    String memberId = "010";
    Member member1 = memberDao.getMember(memberId);
    Member member2 = memberDao.getMember(memberId);
    
    member1 == member2; //다르다
    member 1とmember 2は、同じキーでクエリされた結果オブジェクトです.
    したがって、テーブルは同じローに相当します.
    ただし、メンバー1とメンバー2は別の対象となる.(DAOは新しいオブジェクトを作成して返したためです.)

    JPAによる比較問題の解決


    JPAは、同じ取引時に同じオブジェクトを問い合わせることを保証します.
    (同じオブジェクトであることを確認する方法の詳細については、後述のコースを参照してください.)

    整理する


    オブジェクトモデルとリレーショナル・データベース・モデルが指すパターンが異なります.そのため,一方的なパターンの開発に偏ると,処理すべき問題が多くなる.
    この問題を解決したのはJPAです.
    JPAを使用すると、パターンが一致しない問題を解決し、正確なオブジェクトモデリングによってアプリケーション開発を実現できます.