🐈

JPA(1) オブジェクト指向言語とリレーショナルデータベース

2022/11/06に公開

初めまして、Junior Back-end Developer、SIMOKITAZAWAです。
色々と足りないところがあるかと思いますがよろしくお願い致します。

私がZENNを始めた理由は、

  1. 私が勉強したことをまとめたい
  2. 勉強の内容を共有して一緒に成長したい
  3. 私が間違って理解している部分について先輩たちに教えてもらいたい

このような理由で始めることになりました。
たくさんの教えをお願いします。

オブジェクト指向言語とリレーショナルデータベース

私たちはオブジェクト指向言語(例:Java)を使用することがあります。そして、データベースを使用するときは、リレーショナルデータベース(Mysql、Oracleなど)を使用することがよくあります。 オブジェクトをリレーショナルデータベースに保存して使用する時代です。

そのため、私たちはObjectをDatabaseに伝達する時にSql作らなければなりません。データベースはsqlしか理解できるからです。そのため、エンジニアはテーブルを1つ追加するたびに、登録、修正、削除、照会CRUD SQL文を作成し続ける必要があります。SQLに依存的なコードを作成することになります。

ObjectからSQLに変える時に問題点

public class Itme {

private String itmeId;
private String itemName;
private int price;
*private String itemBody -> ITEMの内容追加*
}

SQL :
	INSERT INTO ITEM(ITEM_ID, ITEM_NAME, PRICE) VALUES
	SELECT ITEM_ID, ITEM_NAME, PRICE FROM ITEM
	UPDATE ITEM SET ...
	
ITEMの内容が追加することによって、

	INSERT INTO ITEM(ITEM_ID, ITEM_NAME, PRICE, *ITME_BODY*) VALUES
	SELECT ITEM_ID, ITEM_NAME, PRICE, *ITME_BODY* FROM ITEM
	UPDATE ITEM SET ...*ITME_BODY*... = ?
	
全てのSQLに追加しなければならないです。

このように一つのValueの追加でSQLを修正しなければなりません。これは、オブジェクト指向言語を使用しながらオブジェクト指向的にコードを作成しなければいけないエンジニアが、sql依存的にコードを作成することになります。


オブジェクトをデータベースに保存する時、sql文に変えて送らなければなりません。sql文に変える時、楽にsql文に変えてデータベースに保存できるでしょうか?答えは、ObjectをSQLに変えるのは難しいです。
オブジェクトとデータベースの違いがあるからです。

  1. オブジェクトには相続関係が存在しますが、関係型データベースには相続関係が存在するとは言えません。
  2. オブジェクトは関連付けで参照できます。例えば、member.getItemなどgetで参照できますが、データベースはPK、FKでJOINしなければなりません。

問題の例

例を一つ挙げてみましょう。

Itemに本、映画チケット、電子機器、衣類など様々なカテゴリーに分けた商品があります。
itemを継承したbookをsqlにsaveする時、2回INSERT SQL文を送らなければなりません。itemテ-ブルに一度、bookテーブルに一度、テーブルが多ければ多いほど、より多くのinsert文を送らなければなりません。
照会する時には、もっと複雑になります。itemテーブルとbookテーブルをJOINするSQLを作成した上で、持ってきたデータをObjectに一つずつ作ってデータ入れます。

list.add(book) → saveする時
Book book = list.get(bookId) → 照会する時

これをJava Collectionにすると簡単に終わります。しかし、これをリレーショナルデータベースに送るために、sql文を作成します。その際に複雑で繰り返しの作業を続けなければなりません。

SQLとJava Collection比べましょう

String itemId = "1";

Item item1 = itemRepository.getItem(itemId)

Item item2 = itemRepository.getItem(itemId)

item1 == item2 ーーーーーー> 同じitemでしょうか?

class ItemRepostory {

public Item getItem(String itemId) {

String sql = "SELECT * FROM ITEM WHERE ITEM_ID = "?";

,,,

return new Item(...);
	}
}

答えは異なることです。item1とitem2はそれぞれ違うSQLでDatabaseに送くられてreturnされたデータで作られたためです。

String itemId = "1";

Item item1 = list.get(itemId)

Item item2 = list.get(itemId)

item1 == item2  ーーーーーー> 同じitemでしょうか?

しかし、Java Collectionですると同じitemです。
この意味は、Java Collectionでのオブジェクトとリレーショナルデータベースでのオブジェクトは異なる点が多いです。そのため、SQLに重点を置いてコードを作成するようになります。
Java Collectionにオブジェクトをsaveして照会するように、リレーショナルデータベースにも適用できないか?この悩みで作られたのがJPAです。

次は、JPAついて勉強します。ありがとうございます。

Discussion