JPA概要



JPAの基本概念


JPAが登場する前から使用していたJDBCやMyBasisの場合、SQLはJavaの上に記述され、DBから適切なResultSetを得る方式である.JDBCはクエリごとにGET/SETを設定し,結果コードが乱雑になり冗長になる.MyBasisはMapperを実現し、各列にマッピングしていませんが、JavaでSQLを作成する必要があります.
リレーショナル・データベースとオブジェクト向け言語のパターンが異なるためです.
JPAは,開発者に代わってこのパターンの違いを補うORMである.JPAを使用することで、多くの既存の問題を解決することができます.JPAがこれまで存在してきたいくつかの代表的な問題をどのように解決したのかを理解してみましょう.

具体的な問題


SQLの開発に依存することは避けられない。


実はこれは最も根本的な問題です.DAOで作成したSQLが無効な場合は、エラーが発生することがあります.したがって、SQLを作成する必要があります.これはオブジェクト向けの観点で解決できる問題ではありません.

本当の意味での階層区分は難しい。


Springでは,コントローラ,サービス,DAOなど異なる層が分割され,サーバが動作する.ビジネスロジックはService Layerで実現され、DAOは簡単なCRUDメソッドだけが正しい設計です.ただし、変更またはエラーが発生した場合は、コードを開く必要があります.また、DAOを開く必要があります.クエリーの結果を表示するか、クエリーを直接変更する必要があります.これは本当の意味での階層とは言えない.実際、この点でも根本的な問題はSQLの開発に依存することを避けることができないことです.

エンティティは信頼できません。


これも同じです.SQLに依存する場合、開発者はエンティティを信頼できません.SQLが無効な場合、テーブルにはnullはありませんが、エンティティにもnull値が含まれます.

JPAのCRUDを使う


では、JPAを使ったCRUDを見て、既存の問題がどれだけ解消されたかを見てみましょう.

INSERT

jpa.persist(member);

SELECT

// ID로 member 테이블 조회
String memberId = "helloId";
Member member = jpa.find(Member.class, memberId);

// 조회된 테이블의 FK로 team 테이블 조회
Team team = member.getTeam();

UPDATE

Member member = jpa.find(Member.class, memberId);
member.setName("updated name");
基本的に、上のコードから見ると、SQLには依存しません.CRUDに必要なテーブルに適したエンティティのみが作成され、persist、findなどの方法でSQLを使用せずに処理できます.
また、SELECTコードの2番目のコードを確認することで、メンバーエンティティにTeam参照変数があることを確認できます.RDBでは外部キーを使用して参照を設定できますが、オブジェクト向け言語では参照変数を直接使用して参照を設定できます.したがってメンバー.getTeamのみを使用しても、memberのteam idを自動的に使用してteamsテーブルをクエリーします.

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

SELECT *
FROM MEMBER A JOIN TEAM B
ON A.TEAM_ID = B.TEAM_ID;
上記のクエリをJDBCとして実行し、対応するresultSetを取得したとします.もしそうであれば、メンバー、Teamエンティティをインポートします.メンバーに関連付けられたOrderエンティティをインポートする場合は、どうすればいいですか?
他のメソッドを作成したり、クエリーを変更したりする必要がある場合があります.SQLの開発に依存することは避けられないため、ビジネスロジックを勝手に変更することはできません.
Member member = jpa.find(Member.class, memberId);

Team team = member.getTeam();
String team_name = team.getName();

Order order = member.getOrder();
String order_price = order.getPrice();
では、上のコードを見てみましょう.最初にインポートしたメンバーエンティティからgetTeamメソッドとしてTeamエンティティをインポートします.また、Orderエンティティをインポートしたいという要望が追加されているため、下図のように、Orderエンティティを直接memberからインポートして使用することも可能です.
実際、ここでSQLクエリーチームテーブルを実行する部分はチームです.getName()です.実際には、エンティティの使用部分が待機し、使用時にクエリーが実行されます.これを지연 로딩といいます.
いくつかの観点では、member、team、orderテーブルに一度アクセスしてデータを受信することがより効果的である可能性があります.これを즉시 로딩といいます.遅延ロードとインスタントロードは、番組の傾向とポリシーでより適切に使用されるのが正しい.