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
http://www.thejavageek.com/2014/05/27/jpa-bean-validation/
前述したInsert/Update 時のJPAのEntityに対してValidationをする場合の参考となるソースが上記記載されています。単純にできて便利です。
上級?JPAでメタモデル
後日記載。
eclipseでJPAのメタモデルを自動生成する設定