[Java ORM標準JPAプログラミング]JPA概要


📌 SQLを直接使用するときに発生する問題


1.無限反復、冗長なコード


JPAを使用せず、SQLとJDBCを使用してメンバー・オブジェクトを作成し、メンバーを検索するコードは次のとおりです.
public class Member{
	private String memberId;
    private String name;
}
public class MemberDAO {
	public Member find(String memberId){...}
}
MemberDAOのfind()メソッドを作成します.
  • 会員のSQLを検索します.
    SELECT MEMBER_ID, NAME FROM MEMBER M WHERE MEMBER_ID = ?

  • JDBC APIを使用してSQLを実行します.
    ResultSet rs = stmt.executeQuery(sql);

  • クエリー結果のメンバー・オブジェクトへのマッピング
  • String memberId = rs.getString("MEMBER_ID");
    String name = rs.getString("NAME");
    
    Member member = new Member();
    member.setMemberId(memberId);
    member.setName(name);
    会員照会機能を確立した.
    登録、変更、削除機能もSQLを記述し、JDBC APIを繰り返し使用する必要があります.
    データベースには、オブジェクト構造とは異なるデータ中心の構造があるため、オブジェクトを直接データベースに格納したりクエリーしたりすることはできません.
    したがって、開発者は、オブジェクト向けのアプリケーションとデータベースの間でSQLとJDBCを使用して直接変換を実行する必要があります(オブジェクト->データ構造).この作業はJPAが代替し,開発者はオブジェクト向けの開発に専念できる.

    2.SQL開発に依存する問題


    🔎 1)登録コードの変更


    上記で作成したメンバーフィールドに連絡先列を追加する場合は、SQLクエリーの挿入、選択、更新、削除に変更が必要です.
    public class Member{
    	private String memberId;
        private String name;
        private String tel;	//연락처 컬럼 추가 
    }
    String sql = "SELECT MEMBER_ID, NAME, TEL FROM MEMBER WHERE MEMBER_ID = ?";
    メンバークラスに連絡先列を追加し、それに応じてSELECTクエリを変更します.
    String tel = rs.getString("TEL");
    member.setTel(tel)
    メンバー・オブジェクトをマッピングする際にも、対応する変更が必要な不便が発生します.

    🔎 2)関連オブジェクト


    会員を増やしてあるグループに属さなければならないという要求.
    class Member{
    	private String memberId;
        private String name;
        private String tel;
        private Team team;	//추가
        
        //Team 객체 반환 
        public Team getTeam(){
        	return team;
        }
    }
    
    //추가된 팀
    class Team{
    	private String teamName;
    }
    member.getTeam(); 実行時、値は常にnullです.
    メンバーを表示するには、メンバーのfind()メソッドを表示するには、上に作成したメンバーのみが「SELECT MEMBER ID、NAME、TEL FROM MEMBERM WHERE MEMBER ID=?」を表示できることがわかります.SQLは保持されています.
    次のsql文をfindWithTeam()メソッドに追加して、メンバーに関連付けられたチームを表示します.
    public class MemberDAO {
    	public Member find(String memberId){...}
        public Member findWithTeam(String memberId){...}
    }
    <会員+チーム照会:メンバー、チームメンバー>
    SELECT M.MEMBER_ID, M.NAME, M.TEL, M.TEAM_ID, T.TEAM_NAME 
    FROM MEMBER M
    JOIN TEAM T
    	ON M.TEAM_ID = T.TEAM_ID
    その結果、MemberDAOクラスを開いてSQLをチェックすると、空の値が発生した理由がわかります.
    会員照会コードはMemberDAOです.find()では、MemberDAO.問題を解決するためにfindWithTeam()に変更する必要があります.
    クリーンアップ:
    メンバー・オブジェクトが関連するTeamオブジェクトを使用できるかどうかは、使用するSQLによって異なります.
    データ・アクセス・レイヤを使用してSQLを非表示にしても、DAOを開いて、実行中のSQLを確認する必要があります.=エンティティが信頼できない

    3.整理

  • は本当の意味での階層区分が難しい.
  • エンティティは信頼できません.
  • SQLによる開発は避けられない.
  • 4.JPAとのトラブルシューティング


    JPAを使用してオブジェクトをデータベースに保存および管理する場合は、開発者がSQLを自分で作成するのではなく、JPAが提供するAPIを使用します.その後、JPAは開発者の代わりに適切なSQLを生成し、データベースに渡します.
    jpa.persist(member);	//저장 -> .persist()
    jpa.find(Member.class, "helloId");	//조회 -> find()
    
    Member member = jpa.find(Member.class, memberId);
    member.setName("변경");	//수정
    
    Member member = jpa.find(Member.class, memberId);
    Team team = member.getTeam();	//연관된 객체 조회
    , sql문 확인 필요 X
    機能の変更->オブジェクトを問合せ、値を変更すると、トランザクションの発行時にupdate SQLがデータベースに送信されます.変更の検出

    📌 パターンの相違


    1.継承




    Albumオブジェクトを保存するには、オブジェクトを分解し、次の2つのSQLを作成する必要があります.
    INSERT INTO ITEM...
    INSERT INTO ALBUM...
    JDBC APIを使用してこのコードを完了するには、親から親データを抽出し、ITEMのINSERT SQLを記述し、子オブジェクトから子データを抽出し、ALBUMのINSERT SQLを記述するだけで、記述するコードの量は少なくありません.
    クエリの場合もITEMテーブルとALBUMテーブルを結合してクエリの数ALBUMオブジェクトを生成する必要があります.
    これらのプロセスは,パターンの不一致を解決するために費やした費用である.

    2.JPAと引き継ぐ


    JPAは開発者に代わって継承に関するパターンの不一致を解決する.
    ちょぞう

    朝礼

    3.関連関係


    オブジェクトは参照を使用して他のオブジェクトと関連付けられたクエリーを行います.
    逆に、テーブルは外部キーを使用して他のテーブルに関連付けられ、結合を使用してクエリーされます.
    オブジェクトは参照のある方向にのみクエリーできます.member.getTeam()は可能ですが、方向が逆のTeamです.getMember()は不可能です.
    逆に、テーブルの1つの外来キーでもMEMBERJOINTEAM、TEAMJOINMEMBERができます.
    class Member {
    
    	String id;
    	Team team;
    	String username;
    
    }
    
    class Team{
    
    	long id;
        String name;
     }
    JPAはチームリファレンスを外部キーに変換し、適切なINSERT SQLをデータベースに渡します.オブジェクトを問い合わせるときに外部キーを参照に変換することもJPAによって処理されます.
    member.setTeam(team)	//회원과 팀 연관관계 설정
    jpa.persist(member)		//회원과 연관관계 함께 저장
    
    Member member = jpa.find(Member.class, memberId);
    Team team = member.getTeam();

    4.オブジェクト図面の参照


    オブジェクトは、オブジェクトシェイプを自由に参照できる必要があります.しかし、最初に実行したSQLがナビゲーション範囲を決定した.
    たとえば、次のSQLは、メンバーDAOでメンバーオブジェクトを問い合わせるときに実行できます.getTeam()は成功しましたが、member.getOrder()をnullに戻します.

    つまり、SQLを直接処理すると、最初に実行したSQLに基づいて、オブジェクトグラフィックをどこにナビゲートできますか.

    メンバー・オブジェクトはメンバー・DAOによってメンバー・オブジェクトに問い合されますが、このコードを表示するだけでは、このオブジェクトに関連付けられたTeam、Order、Delivery方向でオブジェクト・グラフィックをナビゲートできるかどうかは予測できません.最終的にはDAOコードを開いてSQLを直接解決します.

    5.JPAとオブジェクト図面の参照


    では、JPAはどのようにこの問題を解決しますか?
    JPAは、関連オブジェクトの使用時に適切なSELECT SQLを実行します.そのため、JPAを使ってオブジェクトのグラフィックを思う存分閲覧することができます.(遅延ロード)

    6.比較



    member 1,2は同じデータベースでクエリーされていますが、オブジェクトの観点から異なるインスタンスです.

    7.JPAとの比較



    JPAは、同じ取引時に同じオブジェクトを問い合わせることを保証します.

    📌 JPAとは?


    JPAはJava陣営のORM技術標準であり、アプリケーションとjdbcの間で動作する.


    JPAを使用してオブジェクトを格納するコードは次のとおりです.
    jpa.persist(member);
    また、JPAで直接オブジェクトを問い合わせることもできます.

    JPAを使用してオブジェクトを問い合わせるコードは次のとおりです.
    Member member = jpa.find(memberId);
    ORMフレームワークは、開発者の代わりにSQLを生成してデータベースに渡すだけでなく、パターンの不一致の問題を解決することができます.
    したがって、複雑なオブジェクトはオブジェクトの観点からモデリングでき、リレーショナル・データベースはデータベースに基づいてモデリングできます.そして両者をマッピングする方法を教えてください.
    これは、開発者がオブジェクト向けのアプリケーション開発に専念できることを意味します.
    この文章は金英漢のJava ORM標準JPAプログラミング書を参考にした.