👋

JPA(2)Spring Data Jpaは何?Javaエンジニアなら勉強しましょう!

2022/11/10に公開

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

私がZENNを始めた理由は、

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

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

JPAとは何

JavaPersistenceAPIの略で、JavaのORM技術標準です。
ここでORMとはObject-relational mappingの略語で、オブジェクトはオブジェクト通りに設計し、関係型データベースは関係型データベース通りに設計すると、ORMフレームワークがmappingを助けます。

JPAはApplicationとJDBCの間に存在します。エンジニアはJPAにr命令します。
そうするとJPAはJDBCを使用してSQLをデータベースに送ります。
結局、JPAもJDBCを使用することです。
しかし、エンジニアがQueryを直接作らなくても、JPAが代わりに作ってくれる長所があります。

JPAを使ってDatabaseにsave、照会する流れです。

JPAの歴史

JPA前にEJB(Java標準) - EntityBeanが存在しました。
しかし、機能がうまく作動せず、interfaceも多く作らなければなりませんでした。
性能が良くないEJBを使ったGavin Kingというエンジニアがより良いORM技術を作りました。
それがHibernateです。Hibernateを作ることに多くの人が参加するよって、Hibernateはオープンソースになりました。性能がより良いオープンソース技術ができたため、多くのエンジニアがEJBは使わず、Hibernateを多く使用するようになりました。後でJavaでHibernateを作ったGavin Kingをスカウトし、Hibernateとほぼ同じようにORM技術を作ることになります。それがJPAです。

JPAはInterface

JPAを実装しているものは3つあります。最も代表的なのがhibernateです。

JPAはなぜ使用しなければならないのか?

  1. sql中心的な開発からオブジェクト中心に開発
  2. 生産性
  3. メンテナンス
  4. 性能
  5. データアクセス抽象化とベンダーの独立性
  6. Java標準

生産性

Save : jpa.persist(item)
Find : Itemitem=jpa.find(itemId)
Edit : item.setitemName("name")
Delete : jpa.remove(item)

Java CollectionでObjectを使用するように、簡単にすべてのQueryを使用できます。

メンテナンス

JPA(1)からqueryにデータが一つ追加されるたびに、queryに直接追加されたデータを一つずつ作成する必要がありました。

public class Item {
	private String itemId;
	private String itemName;
	private int price;
	** private String itemBody; **
}

JPAはEntityにfieldだけ追加すればいいです。

sql中心的な開発からオブジェクト中心に開発

JPAと継承-Save

jpa.persist(movie);

JPAと継承-find

Movie movie = jpa.find(Movie.class,movieId);(JPAがJoinして持ってきます)

テーブル関係の保存

student.setSchool(school);
jpa.persist(student)

Object探索

Student student = jpa.find(Student.class, studentId);
School school = student.getSchool;

自由にObjectをGetできます。

JPA性能最適化

一次Cacheと同一性(Identity)の保障

jpaを使うと性能がもっと落ちるでしょうか。
単純にsqlを使うよりも性能を向上させることができます。
同じTransactionalの中では同じEntityを返却 → 若干の照会性能向上
DB Isoltaion Leveldl Read CommitでもApplicationでRepeatable Readが保障されます。

String itemId = "1"
Item item1 = jpa.find(Item.class, itemId); //SQL
Item item2 = jpa.find(Item.class,itemId); //Cache

item1 == item2 //true
SQLを1回だけ実行。

Transactional-write-behind

transaction.begin(); transaction start

entityManager.persist(itemA); //1
entityManager.persist(itemB); //2
entityManager.persist(itemC); //3

INSERT SQL送りません。

transaction.commit(); commitする瞬間にまとめて送ります。

そのため、DBに何度も行き来するのではなく、まとめてSQLを送るため性能が向上する長所があります。

Lazy Loading、 Eager Loding

Lazy Loding : Objectが実際に使用される場合、Loding
Eager Loding : JOIN SQLで一度に関連するオブジェクトまで事前に照会

まとめる

日本、中国ではまだMybatisの方が多いでうが、全世界的にJPAの方がMybatisより人気です。
そろそろ日本、中国もJpaが人気になりそうです。

JPAはObjectはObject通り、データベースはデータベース通りに作成できるJava標準ORM技術です。CRUDのSQL文を簡単に作ってくれる利便性を持っています。また、性能も向上させることができるのでJava、Springを使うエンジニアなら一度は勉強するのも良いと思います。

Discussion