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のメタモデルを自動生成する設定

 

 

EclipseLink JPA『is mapped to a primary key column in the database. Updates are not allowed.』

JPAの開発で『is mapped to a primary key column in the database. Updates are not allowed.』というエラーが出る場合、おそらく原因はいろいろあるのだろうけど、自己解決したのでメモ。

既に存在しているレコードに対して、EntityManager.find で atache したのちプライマリキーを上書きした状態で、merge / flush を行うとなるようです。

find して存在するレコードに更新かける場合はプライマリキーを書き換えないようにしましょう。

2016/4/26追記:

上記記載内容でも解決できずまだエラーログが掃かれていたので調査した結果を記載。EntityManagerを使いまわしでいろんなEntityを入れてmerge/flushしてました。emTransaction.commit / rollback 後は使用しなくなったEntitiyはキャッシュクリアを明示的にしないとずっと保持し続けるようで、これが悪さをしていました。

処理が遅くなるけど、 1テーブル処理が終わったらcommit/rollbackと同時に毎回em.clear();するようにしたらタイトルのエラーが出なくなりました。

またEntityのキャッシュについては、アノテーションによるキャッシュとpersistence.xmlによる設定ができるようです。前者の方がEntity毎に管理できるのでよさそうですね。

キャッシュいついての記事。

 

PHPでIE8,9,10,11のユーザエージェントからバージョンを取得する

IEのユーザエージェントがIE8,9,10,11とそれぞれ変わってきているようで、数年前のサンプルコードではIEブラウザバージョンの判定がPHPでできなかったため、作成してみました。


function getIeUaVer(){
// UserAgetn を小文字に統一
$ua = strtolower($_SERVER['HTTP_USER_AGENT']);
// IE の場合、バージョンを取得
if (strstr($ua, 'trident') || strstr($ua, 'msie')) {
$ret = preg_match_all('/(msie|rv:?)\s?([\d\.]+)/', $ua, $arr, PREG_SET_ORDER);
if($ret != FALSE && count($arr) > 0){
if(is_array($arr[0]) && count($arr[0]) > 2){
return intval($arr[0][2]); // version
}
}
}
return FALSE;
}

<span style="line-height: 1.5;">

 

 

 

EclipseLinkのJPAを使ってViewを参照する時の注意点

最近、EclipseLinkのJPAを使った開発をしていますが、単純なテーブル構造の参照・追加の処理においては便利です。

ただ、ViewをJPAで参照する場合はどのように扱ったらよいか分からなかったので、調べてみました。以下2つのサイトが参考になりました。

JPAでDatabase View?

persistence.xmlには、上記記事内の<property name=”hibernate.hbm2ddl.auto” value=”none”/>でなく、<property name=”eclipselink.ddl-generation” value=”none”/>として設定しました。

またJPA-toolでViewからエンティティを作成した場合は『@Column(insertable=false, updatable=false)』を付与してあげましょう。

 

howto-user-metaslider

WordPress Plugin のMetaSliderはスライド画像を容易に設定できるプラグインです。複数の画像スライドショーを作成、管理できます。残念ながら動画スライドショーはできません。「MasterSlider」プラグインであれば、Youtubeなどの動画コンテンツの埋め込んだスライダーも作成できます。

MetaSliderの場合、表示設定時はPHPに直接埋め込んでもできますし、記事・固定ページへショートコードで入れ込むことも可能です。

続きを読む

GoogleCloudVisionAPIを試してみる

先日(3月19日)行われたGoogleCloudVision APIのハンズオンにてサンプルを作成。

フォルダにある画像をサムネイル表示し、対応するボタン押下でサーバ経由でGoogleCloudVision APIをコールしてくれます。

cloudvisionApi

参考URL

契約しているさくらレンタルスタンダードでは、base64コマンドが入っていなかったので、自サーバにて試してみました。

http://test.zamuu.net/googleCloudVision2016/

追記2016/11

2016/11月現在では、https://cloud.google.com/vision/?hl=ja にサンプル動作確認用のフォームがあります。

 

buddypress のユーザ登録承認・有効化する際のメール本文をカスタマイズする

wordpressのSNS向けプラグインであるbuddypressを運用していて、新たにユーザ登録された際、ユーザに自動的にActivateするためのメールが届くのですが、そのやり方を調査したので、以下メモしておきます。

参考にさせてもらったのは以下3つのサイト。

3つめの海外サイトが一番参考になりました。メール本文を変更したい場合は『bp_core_signup_send_validation_email_message』にfilterをかけます。


add_filter( 'bp_core_signup_send_validation_email_message', 'custom_buddypress_activation_message', 10, 3 );
function custom_buddypress_activation_message( $message, $user_id, $activate_url ) {
$user = get_userdata( $user_id );
$post = get_post([有効化]);
return "$user->user_login
$post->post_content
$activate_url
";
}

$post = get_post([有効化]); という部分は、buddypressの「設定」-「固定」にある、有効化させた際の固定ページのidを指定します。有効化した際の固定ページに記載した文章を入れ、これをメール本文として送付するよう修正しています。

 

オープンデータ活用・香川県三豊市と琴平町のゴミ情報・5374アプリ

2016/03/13(日)に『G7香川・高松情報通信大臣会合関連事業 オープンデータ活用セミナー』にて、 5374.jp のハンズオンがありました。

その一環として三豊市のゴミ無しアプリを作成し公開しました。元々はCode for kanazawaが作成したアプリだそうです。
モバイル対応しているので、各地域に広がって蔵たらいいですね。

Webアプリは以下 から閲覧できます。

三豊市5374アプリ(GitHub)

琴平町5374アプリ(GitHub)

 

wordpress「new-user-approve」プラグインの日本語化

wordpress のプラグイン new-user-approve (ver1.7.3)の日本語化をしましたのでpo/moファイルをこちらに置いておきます。

本プラグインは、新しいユーザ登録時に承認と管理機能をもつプラグインです。

翻訳ファイル:download1.0 - WordPressユーザ登録時の承認プラグインの日本語化ファイルです。