Java ORM標準JPAプログラミング-ネイティブ#1 JPA概要-最初
Java ORM標準JPAプログラミング-基本編
この文章は学習金英漢のInfolearn講座の内容をまとめた.
Java Spring開発では、ORMとしてJPAを使用することが多い.
私が使っているのは流行のテクノロジースタックで、問題解決のために検索しやすいなどです.
先に使うと決めた以上.
知っておくべきだと思って勉強を始めました
n/a.ターゲット
この記事では、SQLを中心とした開発における問題点と、オブジェクトとリレーショナル・データベースの違いについて説明します.
次に、JPAが上記の違いによる問題をどのように解決しているのかを簡単に理解します.
SQLを中心とした開発の問題点
発生した問題
JPAでCRUDを作成し、オブジェクト-SQLを解決
JPAを使用すると、オブジェクトのCRUD SQLを直接作成するのではなく、JPAが提供するAPIを使用できます.
JPAは、オブジェクトのマッピング情報を表示し、適切なSQLを生成、実行し、オブジェクトを返します.
パターンの相違
オブジェクトとリレーショナル・データベースの違いは次のとおりです.
継承
オブジェクトには継承関係が明確に存在します.
RDBにはスーパータイプ-サブタイプ関係がある.(これは継承ではなく継承に似た概念です.)
対象を導く継承とERDで表現した例を下図に示す.
発生した問題
Albumオブジェクトを保存する方法を考えてみましょう.
作成
そしてAlbumを調べるにはどうすればいいか考えてみましょう.
各オブジェクト作成
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を使用すると、パターンが一致しない問題を解決し、正確なオブジェクトモデリングによってアプリケーション開発を実現できます.
Reference
この問題について(Java ORM標準JPAプログラミング-ネイティブ#1 JPA概要-最初), 我々は、より多くの情報をここで見つけました
https://velog.io/@hansoleee/자바-ORM-표준-JPA-프로그래밍-기본편-1-JPA-소개-작성중
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
Reference
この問題について(Java ORM標準JPAプログラミング-ネイティブ#1 JPA概要-最初), 我々は、より多くの情報をここで見つけました https://velog.io/@hansoleee/자바-ORM-표준-JPA-프로그래밍-기본편-1-JPA-소개-작성중テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol