そもそも非コンピュータ業界の方からすれば、2進数がベースという辺りから違和感を覚えるのではないかと思う。実際、世界最初の計算機(≠電子計算機)とされる「バベッジの階差機関」(写真1)にしても、世界最初の電子計算機(※1)であるENIACにしても、内部では10進数で演算を行っていた。
「1Byteが8bitに決まったワケ」についての長い話 まずは「バベッジの階差機関」から(1/7 ページ) - ITmedia NEWS
⇧ なかなかの衝撃...はじまりは10進数だったんですな...
というわけで、Javaの話についてです。
レッツトライ~。
RDBMSのテーブルからJPA(Java Persistence API)のEntityを自動生成したい
誰もが一度は思うのかしら、同じ様なことを考えてらっしゃる方がおられましたと。
公開したライブラリは「jpa-entity-generator」というものです。その名の通り JPA の仕様に準拠したエンティティクラスを自動生成するライブラリです。Gradle、Maven のプラグインとして公開しており、この二つの build tool を使っているプロジェクトであればすぐに使うことができます。
社内で 2 年使ってきたコードを OSS として Maven Central に公開しました - SmartNews Engineering Blog
⇧ 上記サイト様は自作してらっしゃる模様、恐るべし...。
一応、Oracleさんが
⇧ EclipseでテーブルからJPAエンティティ自動生成できると言っているんだけど、情報が見事に端折られていて、
⇧ 上記サイト様によりますと、「Eclipse」で「JPA プロジェクト」を作成しとく必要があるみたい。
Spring Data JPAって、JPA(Java Persistence API)に準拠してたんでしたっけ?
まずは、JPA(Java Persistence API)が何かをおさらい。
Java Persistence API(JPA)とは、関係データベースのデータを扱うJava SEおよびJakarta EE(旧・Java EE)のアプリケーションを開発するためのJava用フレームワークである。
JPAは、以下の3つの部分から成る。
JPAのリファレンス実装はEclipseLinkとして実装されている。
歴史
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日に承認された。
⇧「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.
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:
- Jakarta Persistence (JPA)
- Jakarta XML Binding (JAXB)
- Jakarta Connectors (JCA)
- Service Data Objects (SDO)
⇧ とあるように、「EclipseLink」自体がフレームワークということらしく、その一機能が「Jakarata Persistence」ってのが「JPA(Java Persistence API)」の一実装ってことかと思いきや、
Jakarta Persistence defines a standard for management of persistence and object/relational mapping in Java(R) environments.
⇧ 仕様ですと、というか、「Java」のバージョンによっては「JPA(Java Persistence API)」ではなく「JPA(Jakarata Persistence API)」となるらしい...紛らわし過ぎるな...
で、実装の例として、
Compatible Implementations
⇧「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.
⇧「JPA(Java Persistence API)」の一実装ということだとは思うんですが、「JPA(Jakarata Persistence API)」の「Compatible Implementations」の例で紹介されてなかったのが気になるんよね...つまり、『「互換性のある実装」とは言えない実装』それが「Spring Data JPA」ってことになっちゃうみたいね...
となると、違いが知りたくなるのが人情ってものじゃないでしょうか?
脱線しましたが、
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.
⇧ 正確に言えば、「JPA(Java Persistence API)」の「add-on」ということらしいのですが、「拡張機能」は「JPA(Java Persistence API)」の仕様をちゃんと網羅してるのかを知りたいんですがね...
とりあえず、JDBCドライバのjarファイルをダウンロードしておく
「JPAプロジェクト」の場合、「Maven」や「Gradle」のようなビルドツールで「依存関係」で「JDBCドライバ」とかを追加が難しそうなので、ダウンロードしておきます。
ちなみに、自分の環境では、PostgreSQLをインストールしているので、PostgreSQLのJDBCドライバをダウンロードします。
ちなみに、ブラウザからダウンロードする場合、
の2つのサイトがよく検索に引っかかってくれるわけなんですが、何が違うんですか?という同様の疑問を持った方がおられまして、
What's the difference between https://search.maven.org/ and https://mvnrepository.com/?
⇧ ってな問いかけに対して、
The first one is the official central search engine of Central Repository handled and very well maintained by
- Sonatype Inc.
- with support etc. https://central.sonatype.org/)
- Status Information about Central: https://status.maven.org/
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.
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://search.maven.org/」のほうがメンテナンスがしっかりされてるってことなんかね?
まぁ、今回は、「https://mvnrepository.com/」のほうを使ってます。
「postgresql jdbc」でSearchして表示された、「org.postgresql > postgresql」の「postgresql」のリンクをクリック。
「Version」が「42.3.2」のリンクをクリック。
「Files」の「jar」をクリックでダウンロードします。
ダウンロードできたら、適当な場所に配置しておきます。
EclipseでJPAプロジェクトを作成...できないんだが
何か、
⇧ Eclipseの公式っぽいドキュメントによると、「Eclipse」で「JPA プロジェクト」作成できるって話になってたので、作成しようとしたのですが、
はい、エラー。
何か、
⇧ 上記サイト様によりますと、「EclipseLink 」を直にダウンロードするしかない模様...う~ん、「Eclipse」自体のバグなんかな?
いや、別にバグがあるのは仕方ないとは思うんだけど、周知して欲しいよね...
ドキュメントが全く嘘ってことになってしまいますし...
仕方ないので、JPAプロジェクト作成時は「EclipseLink」なしで試してみる
JPAプロジェクト作成時に、「EclipseLink」を設定しなければ先に進めるので、とりあえず「JPA 実装」の「型:」については「ライブラリー構成を無効」にして、「完了(F)」を選択。
接続するデータベースは「PostgreSQL」を選択。
「新規ドライバー定義」を選択し、
「名前/タイプ」タブの「PostgreSQL JDBCドライバー」を選択するとエラーが出るので、エラー出てる状態で「jarリスト」タブを選択します。
「ドライバー・ファイル(F):」にあるjarを選択し、「JAR/Zip の除去(R)」を選択し、
「Jar/Zip の追加(A)...」を選択。
さきほどダウンロードしておいた「JDBCドライバ」を選択。
「ドライバー・ファイル(F):」に追加されたらば、「プロパティー」タブを選択。
データベースへの接続情報を設定します。ご自分の環境に合わせたものを設定してください。設定したら「OK」で。
「テスト接続」してみて、「成功」したらOK。「完了(F)」を選択。
「接続からデフォルト・スキーマをオーバーライド(V)」にチェックを付けて、「完了(F)」を押下。
「JPAプロジェクト」が作成されたらば、プロジェクトを選択した状態で右クリックし「JPAツール」>「テーブルからエンティティを生成...」を選択。
自分で作成してあったテーブルが表示されてます。今回はすべて選択して「次へ(N)>」してみました。
「外部キー制約」のあるテーブルについては、テーブル間のリレーションも良しなに設定してくれるってことなんですかね?デフォルトの状態で「次へ(N)>」を押下。
デフォルトの状態で「次へ(N)>」を選択しました。
で、むっちゃエラー出てるやん...
だけど、これは、「JPAプロジェクト」の作成の時に「JPA 実装」の「型:」で「ライブラリ構成を無効」を選択してるので、「JPA」の「依存関係」ないしは、「jar」ファイルを追加すれば解消されるかと。
というわけで、「javax.persistence.」のjarファイルをダウンロードして、
適当な場所に配置。
「ライブラリー(L):」タブの「モジュールパス」を選択し、今回はプロジェクトの外にjarを配置してしまっているので、「外部 JARの追加(X)...」を選択。
「適用して閉じる」を選択。
「プロジェクト(P)」>「クリーン(N)...」を選択で。
「クリーン(C)」でプロジェクトをビルドし直します。
自分の環境では、「/test-jpa/src/META-INF/persistence.xml」に1カ所だけエラーが出ましたが、概ねテーブルからEntityの生成ができてるようです。
ただし、主キーに対して、「javax.persistence.EmbeddedId」のアノテーションが使われていたりと、ちょっと微妙なところがありそう。あと、「getter」「setter」が作成されたりと、「lombok」使ってる場合には不要なものも生成されてしまってます。
このあたりは、設定で上手いこと良しなに調整してくれるのかは要検証ですかね。
もし、微調整ができるようなら、かなり重宝しそうな気はしますが、いかんせん、情報が少ないのと、「Eclipse」自体のバグもあるので何とも言えませんな...
「Eclipse」のブラックボックスな部分、もう少し何とかして欲しいよね...
毎度モヤモヤ感が半端ない...
今回はこのへんで。