RDBMSのテーブルからJPA(Java Persistence API)のEntityを自動生成したい

f:id:ts0818:20220203213934j:plain

www.itmedia.co.jp

 そもそも非コンピュータ業界の方からすれば、2進数がベースという辺りから違和感を覚えるのではないかと思う。実際、世界最初の計算機(≠電子計算機)とされる「バベッジの階差機関」(写真1)にしても、世界最初の電子計算機(※1)であるENIACにしても、内部では10進数で演算を行っていた。

「1Byteが8bitに決まったワケ」についての長い話 まずは「バベッジの階差機関」から(1/7 ページ) - ITmedia NEWS

⇧ なかなかの衝撃...はじまりは10進数だったんですな...

というわけで、Javaの話についてです。

レッツトライ~。

RDBMSのテーブルからJPAJava Persistence API)のEntityを自動生成したい

誰もが一度は思うのかしら、同じ様なことを考えてらっしゃる方がおられましたと。

developer.smartnews.com

公開したライブラリは「jpa-entity-generator」というものです。その名の通り JPA の仕様に準拠したエンティティクラスを自動生成するライブラリです。Gradle、Mavenプラグインとして公開しており、この二つの build tool を使っているプロジェクトであればすぐに使うことができます。

社内で 2 年使ってきたコードを OSS として Maven Central に公開しました - SmartNews Engineering Blog

⇧ 上記サイト様は自作してらっしゃる模様、恐るべし...。

一応、Oracleさんが

docs.oracle.com

EclipseでテーブルからJPAエンティティ自動生成できると言っているんだけど、情報が見事に端折られていて、

medium.com

⇧ 上記サイト様によりますと、「Eclipse」で「JPA プロジェクト」を作成しとく必要があるみたい。

Spring Data JPAって、JPAJava Persistence API)に準拠してたんでしたっけ?

まずは、JPAJava Persistence API)が何かをおさらい。

Java Persistence APIJPA)とは、関係データベースのデータを扱うJava SEおよびJakarta EE(旧・Java EE)のアプリケーションを開発するためのJavaフレームワークである。

Java Persistence API - Wikipedia

JPAは、以下の3つの部分から成る。

  • API(javax.persistence パッケージで定義されている)
  • Java Persistence Query Language
  • オブジェクト/関係メタデータ

JPAリファレンス実装EclipseLinkとして実装されている

Java Persistence API - Wikipedia

歴史

Java Persistence API 1.0は、JSR 220 (EJB 3.0) Expert Groupの作業の一部として2006年5月11日に策定された。JPA 2.0はJSR 317として、2009年12月10日Java EE 6やEJB 3.1と同一日に承認された。JPA 2.1はJSR 338として、2013年4月22日に承認された。

Java Persistence API - Wikipedia

⇧「JSR(Java Specification Requests)」で策定されたってことから、『「RDBMS(Relational DataBase Management System)」を「Java」で扱うためのフレームワーク』の「仕様」ってことらしいですと。

JPAリファレンス実装EclipseLinkとして実装されている。』とあり、「EclipseLink」って何なのよ?

EclipseLink is the open source Eclipse Persistence Services Project from the Eclipse Foundation

https://en.wikipedia.org/wiki/EclipseLink

The software provides an extensible framework that allows Java developers to interact with various data services, including databases, web services, Object XML mapping (OXM), and enterprise information systems (EIS). EclipseLink supports a number of persistence standards including:

https://en.wikipedia.org/wiki/EclipseLink

⇧ とあるように、「EclipseLink」自体がフレームワークということらしく、その一機能が「Jakarata Persistence」ってのが「JPAJava Persistence API)」の一実装ってことかと思いきや、

jakarta.ee

Jakarta Persistence defines a standard for management of persistence and object/relational mapping in Java(R) environments.

https://jakarta.ee/specifications/persistence/3.0/

⇧ 仕様ですと、というか、「Java」のバージョンによっては「JPAJava Persistence API)」ではなく「JPA(Jakarata Persistence API)」となるらしい...紛らわし過ぎるな...

で、実装の例として、

⇧「EclipseLink」と「Hibernate ORM」ってのが紹介されておりました。

で、「Spring Data JPA」はと言うと?

Spring Data JPA, part of the larger Spring Data family, makes it easy to easily implement JPA based repositories. This module deals with enhanced support for JPA based data access layers. It makes it easier to build Spring-powered applications that use data access technologies.

https://spring.io/projects/spring-data-jpa

⇧「JPAJava Persistence API)」の一実装ということだとは思うんですが、「JPA(Jakarata Persistence API)」の「Compatible Implementations」の例で紹介されてなかったのが気になるんよね...つまり、『「互換性のある実装」とは言えない実装』それが「Spring Data JPA」ってことになっちゃうみたいね...

となると、違いが知りたくなるのが人情ってものじゃないでしょうか?

脱線しましたが、

www.amitph.com

What is Spring Data JPA, if not a JPA Implementation?
Speaking precisely, Spring Data JPA is add-on for JPA. it provides a framework which works together with JPA and provides a complete abstraction over the Data Access Layer in a project.

What is JPA, Spring Data and Spring Data JPA - amitph

⇧ 正確に言えば、「JPAJava Persistence API)」の「add-on」ということらしいのですが、「拡張機能」は「JPAJava Persistence API)」の仕様をちゃんと網羅してるのかを知りたいんですがね...

とりあえず、JDBCドライバのjarファイルをダウンロードしておく

JPAプロジェクト」の場合、「Maven」や「Gradle」のようなビルドツールで「依存関係」で「JDBCドライバ」とかを追加が難しそうなので、ダウンロードしておきます。

ちなみに、自分の環境では、PostgreSQLをインストールしているので、PostgreSQLJDBCドライバをダウンロードします。

ちなみに、ブラウザからダウンロードする場合、

の2つのサイトがよく検索に引っかかってくれるわけなんですが、何が違うんですか?という同様の疑問を持った方がおられまして、

stackoverflow.com

⇧ ってな問いかけに対して、

The first one is the official central search engine of Central Repository handled and very well maintained by

whereas the part https://repo.maven.apache.org/maven2/ is the real Central repository (distributed world wide via CDN) which is being used by default by Apache Maven, Gradle etc.

https://stackoverflow.com/questions/62882189/difference-between-search-maven-org-and-mvnrepository-com

The second one is a search engine (not always up to date.) and sometimes misused as a repository which does not work cause it's only a search engine. Not really visible by whom it's being maintained/used etc.

https://stackoverflow.com/questions/62882189/difference-between-search-maven-org-and-mvnrepository-com

⇧ なんか、「https://search.maven.org/」のほうがメンテナンスがしっかりされてるってことなんかね?

まぁ、今回は、「https://mvnrepository.com/」のほうを使ってます。

mvnrepository.com

postgresql jdbc」でSearchして表示された、「org.postgresql > postgresql」の「postgresql」のリンクをクリック。

f:id:ts0818:20220203202807p:plain

「Version」が「42.3.2」のリンクをクリック。

f:id:ts0818:20220203203043p:plain

「Files」の「jar」をクリックでダウンロードします。

f:id:ts0818:20220203203147p:plain

f:id:ts0818:20220203203240p:plain

ダウンロードできたら、適当な場所に配置しておきます。

f:id:ts0818:20220203203512p:plain

f:id:ts0818:20220203203548p:plain

EclipseJPAプロジェクトを作成...できないんだが

何か、

www.eclipse.org

Eclipseの公式っぽいドキュメントによると、「Eclipse」で「JPA プロジェクト」作成できるって話になってたので、作成しようとしたのですが、

f:id:ts0818:20220203175845p:plain

f:id:ts0818:20220203175941p:plain

f:id:ts0818:20220203180109p:plain

f:id:ts0818:20220203180142p:plain

f:id:ts0818:20220203180239p:plain

f:id:ts0818:20220203180321p:plain

f:id:ts0818:20220203180634p:plain

はい、エラー。

f:id:ts0818:20220203180754p:plain

何か、

www.eclipse.org

⇧ 上記サイト様によりますと、「EclipseLink 」を直にダウンロードするしかない模様...う~ん、「Eclipse」自体のバグなんかな?

いや、別にバグがあるのは仕方ないとは思うんだけど、周知して欲しいよね...

ドキュメントが全く嘘ってことになってしまいますし...

仕方ないので、JPAプロジェクト作成時は「EclipseLink」なしで試してみる

JPAプロジェクト作成時に、「EclipseLink」を設定しなければ先に進めるので、とりあえず「JPA 実装」の「型:」については「ライブラリー構成を無効」にして、「完了(F)」を選択。

f:id:ts0818:20220203195132p:plain

接続するデータベースは「PostgreSQL」を選択。

f:id:ts0818:20220203195306p:plain

「新規ドライバー定義」を選択し、

f:id:ts0818:20220203195501p:plain

「名前/タイプ」タブの「PostgreSQL JDBCドライバー」を選択するとエラーが出るので、エラー出てる状態で「jarリスト」タブを選択します。

f:id:ts0818:20220203203653p:plain

「ドライバー・ファイル(F):」にあるjarを選択し、「JAR/Zip の除去(R)」を選択し、

f:id:ts0818:20220203203842p:plain

「Jar/Zip の追加(A)...」を選択。

f:id:ts0818:20220203203958p:plain

さきほどダウンロードしておいた「JDBCドライバ」を選択。

f:id:ts0818:20220203204125p:plain

「ドライバー・ファイル(F):」に追加されたらば、「プロパティー」タブを選択。

f:id:ts0818:20220203204354p:plain

データベースへの接続情報を設定します。ご自分の環境に合わせたものを設定してください。設定したら「OK」で。

f:id:ts0818:20220203204717p:plain

「テスト接続」してみて、「成功」したらOK。「完了(F)」を選択。

f:id:ts0818:20220203204803p:plain

「接続からデフォルト・スキーマをオーバーライド(V)」にチェックを付けて、「完了(F)」を押下。

f:id:ts0818:20220203204938p:plain

JPAプロジェクト」が作成されたらば、プロジェクトを選択した状態で右クリックし「JPAツール」>「テーブルからエンティティを生成...」を選択。

f:id:ts0818:20220203205215p:plain

自分で作成してあったテーブルが表示されてます。今回はすべて選択して「次へ(N)>」してみました。

f:id:ts0818:20220203205319p:plain

「外部キー制約」のあるテーブルについては、テーブル間のリレーションも良しなに設定してくれるってことなんですかね?デフォルトの状態で「次へ(N)>」を押下。

f:id:ts0818:20220203205511p:plain

デフォルトの状態で「次へ(N)>」を選択しました。

f:id:ts0818:20220203205719p:plain

f:id:ts0818:20220203205818p:plain

で、むっちゃエラー出てるやん...

だけど、これは、「JPAプロジェクト」の作成の時に「JPA 実装」の「型:」で「ライブラリ構成を無効」を選択してるので、「JPA」の「依存関係」ないしは、「jar」ファイルを追加すれば解消されるかと。

f:id:ts0818:20220203205942p:plain

というわけで、「javax.persistence.」のjarファイルをダウンロードして、

f:id:ts0818:20220203210614p:plain

f:id:ts0818:20220203210737p:plain

適当な場所に配置。

f:id:ts0818:20220203210840p:plain

f:id:ts0818:20220203210956p:plain

「ライブラリー(L):」タブの「モジュールパス」を選択し、今回はプロジェクトの外にjarを配置してしまっているので、「外部 JARの追加(X)...」を選択。

f:id:ts0818:20220203211153p:plain

f:id:ts0818:20220203211357p:plain

「適用して閉じる」を選択。

f:id:ts0818:20220203211537p:plain

「プロジェクト(P)」>「クリーン(N)...」を選択で。

f:id:ts0818:20220203211634p:plain

「クリーン(C)」でプロジェクトをビルドし直します。

f:id:ts0818:20220203211734p:plain

自分の環境では、「/test-jpa/src/META-INF/persistence.xml」に1カ所だけエラーが出ましたが、概ねテーブルからEntityの生成ができてるようです。

f:id:ts0818:20220203212006p:plain

ただし、主キーに対して、「javax.persistence.EmbeddedId」のアノテーションが使われていたりと、ちょっと微妙なところがありそう。あと、「getter」「setter」が作成されたりと、「lombok」使ってる場合には不要なものも生成されてしまってます。

このあたりは、設定で上手いこと良しなに調整してくれるのかは要検証ですかね。

もし、微調整ができるようなら、かなり重宝しそうな気はしますが、いかんせん、情報が少ないのと、「Eclipse」自体のバグもあるので何とも言えませんな...

Eclipse」のブラックボックスな部分、もう少し何とかして欲しいよね...

毎度モヤモヤ感が半端ない...

今回はこのへんで。