JPA(Java Persistence API)?
JPA(Java Persistence API)?
SQLを中心とした開発の問題点
オブジェクトとリレーショナル・データベースの違い
オブジェクトには継承関係があり、リレーショナル・データベースには継承関係がありません.
オブジェクトには参照があります(参照).//関連オブジェクトをgetterにインポートできます.
リレーショナル・データベースは、PKまたはFKを使用してjoinを行い、必要なデータを検索できます.
JPA
ORM
従来のJDBC APIとSQL中心の動作
JPAのアプリケーションとJDBC間の動作
JavaアプリケーションコマンドJPAは、JDBC APIを使用してSQLを作成し、DBに送信します.
JPA動作-保存
jpa.persist(member); // 저장
JPAアクション-ブラウズ
Member member = jpa.find(memberId); // 조회
なぜJPAを使うのですか?
せいさんこうりつ
開発者は冗長で重複したコードやCRUD用のSQLを書く必要はなく、JPAはDDL文を自動的に生成する機能も備えている.例えば
CREATE TABLE
CRUDの定義は以下の通りです://コードはJavaの集合フレームワークのように簡潔です.jpa.persist(member)
Member member = jpa.find(memberId)
member.setName("변경할 이름")
jpa.remove(member)
メンテナンス
以前は、フィールドを変更するときにすべてのSQLを変更する必要がありました.たとえば、フィールドを追加した場合は、そのフィールドを使用するすべての場所を変更する必要があります.
JPAではフィールドを追加するだけです.SQLは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.メインキャッシュと一致することを確認
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
transaction.begin(); // 트랜잭션 시작
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
// 여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.
// 커밋하는 순간 데이터베이스에 INSERT SQL을 모아서 보낸다.
transaction.commit(); // 트랜잭션 커밋
3.遅延ロードとインスタントロード
// 지연 로딩
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を発行して取得する.
つまり、必要に応じてクエリーを発行して値を取得します.
インスタントロードは、メンバーをクエリーすると、メンバーに関連付けられたすべてのオブジェクトがインポートされます.
メンバーをインポートする場合は、メンバーのみを使用すると、遅延ロードがよりよくなります.メンバーとともに関連オブジェクトを使用する場合は、すぐにロードしたほうがいいです.
詳細
References
Reference
この問題について(JPA(Java Persistence API)?), 我々は、より多くの情報をここで見つけました https://velog.io/@songs4805/JPA-JPAJava-Persistence-APIテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol