JPA(EclipseLnk)のEntitiyをPostgresqlデータベースから自動生成してValidationまで


JPA(EclipseLnk)のEntitiyをPostgresqlデータベースから自動生成してValidationまでの実装(?)について記載します。

EclipseLinkのJPAはものすごく簡単に便利な機能を提供してくれてます。テーブルの定義がしっかりしていたらその定義のままにEntitiy(Bean)を作成してくれます。

Entity作成手順

Java Persistence API (JPA) を導入します。最初のEclipse自体のセットアップとJPAプロジェクト作成については以下が参考になりました。

DBにあるテーブルへの接続設定

予めDBとテーブルを作成しておきます。JPAパースペクティブを開き、DBへの接続設定を登録します。

ウィザードを使ってEntityを自動作成

プロジェクトを右クリック「JPA TOOL」-「Generate Entities From Table…」を選択するとEntity作成ウィザードが立ち上がります。

「Always generate optional JPA annotations and DDL parameters」にチェックを入れておくとカラム長、ユニークキー、NULL許可などの設定も@column アノテーションに自動付与してくれるので便利です。

@Idはプライマリキーに対して設定されます。

プライマリキーにシーケンスを使っている場合は、@GenaratedValue と @Sequence を使って@Idに自動付与してくれるようにします。

Entityに対してのSQL設定について

SQLはJQLという形式でEntityManager.CreateNamedQueryで定義できたり、SQLそのまま書けるEntityManager.CreateNativeQueryと、動的にソースの中で作成していけるCriteriaBuilderを利用する3つの方法があります。

SQLをそのまま利用したい場合はCreateNativeQueryでよいですし、単純なレコード取得・更新・作成が多ければNamedQueries({NamedQuery(…)[…]})といった形式でEntityに直に書いていった方が楽かもしれません。

また抽出条件が動的に変わるならCriteriaBuilderをお勧めしますが、やはりJOIN等でテーブル関係が複雑になるようだったらデータベース側でViewを作ってしまった方がよいでしょう。

JPAでの挿入・更新・参照

明らかに新規データの時は、EntityManager.persistを使った方がよさそうです。更新挿入(Update or Insert)をする場合は、EntityManager.mergeを利用します。その際に注意点が1つ。

更新時は更新対象のレコードをEntityManager.findや上記NamedQueryなどを利用して、Entityへデータを読み込んでおく必要があります。おそらく、プライマリキーが設定されていたらUpdateして、未設定ならInsertしてくれるんだと思います。あたりまえですが、その際にユニークキーが他のレコードなどと被っているとInsert時にエラーとなったりしてしまいます。

Entityに対してのカラムチェック等・・・Validation

JPA Bean Validation

前述したInsert/Update 時のJPAのEntityに対してValidationをする場合の参考となるソースが上記記載されています。単純にできて便利です。

上級?JPAでメタモデル

後日記載。

eclipseでJPAのメタモデルを自動生成する設定

 

 


投稿者: cova

ザムウ取締役CTO。2010年に大阪から香川へ移住しフリーランスSEとして活動をはじめる。領域としてWeb系から組込み系+サーバ構築。中小企業基盤整備機構にて中小企業の経営支援と、小学校にてICT講習を務める。2021年現在、子育て支援NPO理事、短大専任講師を兼任する。 【主な資格】経営学修士(MBA)修了、国家試験応用情報技術者、国内初の夫婦ITコーディネーター。 その他、2021年4月:2児(3歳・0歳)の父に就任。 #赤ちゃんから学ぶ経営学 を配信。