EclipseLinkを使ってみる~初めてのORM

O/Rマッパーとやらはとても便利だそうなのであんまり概念とか分かってないけど使ってみる。

テーブルを作成

前回の記事のとおりデータベースを追加し、テーブルもNetBeansで定義してCraete。
データベースはH2を使用している。
テーブルはこのとおりやっつけ系。
f:id:vostochnaya:20140426180751p:plain

エンティティ・クラスを作る

その名のとおりエンティティ。

  1. プロジェクト右クリック 新規 > データベースからのエンティティ・クラス
  2. ウィザードが出てくるのでデータベース接続を選択し、クラスを作りたいテーブルを追加する
  3. 次へ > 次へ で完了

SampleTable.java と SampleTablePK.java が作成された。
できたてはエラーになっていたけどバックグラウンドで eclipselink が依存性に追加され、勝手にエラーが解消した。

コントローラ・クラスを作る

エンティティだけじゃ何もできないのでコントローラ・クラスを追加してみる。

  1. 持続性カテゴリからエンティティ・クラスのJPAコントローラ・クラスを新規作成
  2. 先ほど作成したSampleTable.javaがあるのでそれを追加する

SampleTableJpaController.java が作成された。
ついでに同列にexceptionsパッケージが追加され、例外クラスが生成されている。

  • IllegalOrphanException.java
  • NonexistentEntityException.java
  • PreexistingEntityException.java

persistence.xmlを編集

スキーマがPUBLICのせいかテーブルが見つかりませんエラーが出るので少し修正。
persistence.xml に propertyを追加する。

<property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>

更に、接続の時の名前が自動生成だとアレな感じなので変えておく。
とりあえず test と・・・(余計悪い名前になった感)

<persistence-unit name="test" transaction-type="RESOURCE_LOCAL">

接続

では実行してみる。とりあえず動いた。

実行結果

Key1: KEY_1
Key2: KEY_2
Att VChar:Sample Text
Att Dec: 1
Att Date: Sat Apr 26 19:37:20 JST 2014
Att Time: 19:37:20

NetBeans Mavenプロジェクトでライブラリの追加

せっかくのMavenプロジェクトなのに手動でライブラリ追加とかしてたから見直しました。
JavaプロジェクトじゃなくてMavenプロジェクトにして何も変えてないという意味なし具合。

ライブラリの追加

H2 driverを追加してみる。

  1. NetBeansの左側にあるナビゲーションから「サービス」タブを開く
  2. Mavenリポジトリ > Central Repository を開く
  3. 大量に出てくるので探す。検索どうやるんだコレ…
    H2は「com.h2.database」
  4. 見つかったらフォルダを開くと「h2」が出てくるので更に開く
  5. バージョンがこれまた大量に出るので使うバージョンを右クリック > 依存性として追加

確かに楽ですね。


ちなみにJavaプロジェクトの場合はライブラリの共有ができるようだ。
Mavenじゃない場合はこれでも良いかも。

NetBeansからH2 DBに接続する

調べてもちょうど良いサイトが見つからなかったから自分でメモ。
正しいやり方なのかどうかは分からないけど接続はできた。

前提

  • H2 DBファイルが生成されていること
    *2014/4/19追記
    生成されてない場合は新しいファイルが作成される
  • ドライバjarがあること

ドライバの登録

  1. サービスタブの データベース > ドライバ を右クリック > 新規ドライバ...
  2. H2のjarファイル(h2-x.x.xxx.jar)を選択
  3. ドライバ・クラスは検索を押すと勝手に出てくる
  4. 名前は自分が認識できれば何でも良い

f:id:vostochnaya:20140330132338p:plain

データベース接続の登録

  1. ドライバの登録で作成したドライバを右クリック > 接続...
  2. 新規接続ウィザードが出てくるので設定。
    ドライバ名:ドライバの登録で登録したもの
    ユーザー名:DBユーザー
    パスワード:DBユーザーのパスワード
    JDBC URL:「jdbc:h2:<DBファイルパス>」
    f:id:vostochnaya:20140330140548p:plain
    ※DBファイルパスはjarファイルからの相対パスも可
  3. スキーマの選択。接続したいスキーマを選ぶ。明示的に作っていない場合はPUBLICでOK
  4. 接続名の入力。分かりやすい名前で。スキーマが複数ある場合はスキーマ名も入れておくと良い。

引越し手続き

あまりの忙しさに引越し作業が捗らない。
色々と手続きをすませたので次回のためにメモ。
前提:東京→神奈川に引越し

電気

東京電力のサイト「お引越しの手続き」より停止・開始の手続きが可能。
お引越しの手続き|東京電力
※お客様番号が必要

どうやらでんき家計簿とやらに入会(無料)しないと手続きできない残念仕様のよう。
なお「引越れんらく帳サービス」にも強制加入となる。必要なければ引越し後に退会しよう。
東電の引越しれんらく帳サービスはガスや水道も同時に手続きできるようだが
自分は電気の手続きを最後にやってしまったため利便性は不明。

入力で建物名がカタカナじゃないことに気づかずエラーでなかなか進めなかった。
なんで漢字はダメなんだ…

ガス

東京ガスのサイト「お引越しの際の手続き」より手続き可能。
東京ガス : お手続き・サポート / お引越しの際の手続き-ガスのご使用開始/中止のお申し込み-

現在の住居はオール電化で契約していないので新しい家の契約のみ。
新旧の住居が東京ガスの場合は一括で手続きできる。
ガスの開閉は立ち会いが必要なので注意すること。

水道

東京水道局のサイト「インターネットでのお手続き」より手続き可能。
サービスメニュー
※お客様番号が必要

新居はお客様番号が分からないため管轄水道局のサービスセンターに電話連絡。
新築でまだ水道局にお客様番号的なものが届いてないらしく手続き不可。
蛇口ひねれば水は使えるようになっているので支払いの手続きなどは新居にある書類送ってくださいとのこと。

郵便転送

郵便物の転送の手続きも忘れずに。日本郵政のサイト「e転居」より手続き可能。
あたらしい町にも、しっかり届く安心。e転居 - 郵便局

本題とは関係ないけどwelcometownってURL良いね。

転出届・転入届

転出届は引越しの2週間前から、転入届は引越し後2週間以内に手続きが必要。
遅れても罰則はないけどちゃんと移動しましょう。

引越しシーズンならたいていの自治体で土曜か日曜に臨時開庁していると思われるので活用しよう。

その他

クレジットカード:カード会社のサイトから手続き可能でした。
銀行口座:銀行のサイトから手続き可能でした。
携帯:携帯会社のサイトから手続き可能でした。

基本的に領収書なんかもWebにしてるからほぼWebから時間を気にせずできるようだ。便利。
ショッピングサイトの住所変更は次買い物するタイミングでいいかなー。

FXMLの多言語対応(未解決・暫定対応)

分からないことだらけで全然進まないよ。

FXML便利。
HTML分かる人間からするとSwingだのJFaceだのでかなり面倒な思いをしたGUIの作成がすごく分かりやすくなった。呼び出しもControllerとの結びつけも実にシンプル。

そんな中、次の課題はラベルの文字列。
普通ならこれまた簡単に対応できててResourceBundleを第2引数で渡せば良いようだ。

label.propertiesならこんな感じ。

FXMLLoader.load(getClass().getResource("screen.fxml"),ResourceBundle.getBundle("label")));

FXMLの方はこんな感じで。

<TextField fx:id="cencel" text="%cancelButton" />

参考:

How to load FXML with values from Preferences in JavaFX?

http://stackoverflow.com/questions/10792890/how-to-load-fxml-with-values-from-preferences-in-javafx


何が普通でないかというと、propertiesはnative2asciiが面倒だから自分用にXMLファイルをリソースとして読み込むResourceBundleを作って使っているのです。
ResourceBundleを継承してるから渡すことはできるけど、getBundleをオーバロードしてるメソッドを使いたい。(キーのマッピングを楽にするための小細工が入ってる)
結局やり方が分からなかったから直接リソースのキーを指定して対応している。
あるいはControllerの方でテキストを設定してあげれば問題ないだろう。
ラベルなんかはできればView側でクローズしたいところだが。

FXMLでclassをimportできるから何かやりようはある気がしている。

getResourceのパス指定

うっかりNullPointerExceptionが出たので戒め。

FXMLファイルを読み込むためこんなコードを書いた。
welcomeScreen.fxmlはパスを通したフォルダにfxmlフォルダを作り、その中に。
Javaソースは普通にsrc以下のパッケージの中。
IOExceptionはthrow.

AnchorPane pane = FXMLLoader.load(getClass().getResource("fxml/welcomeScreen.fxml"));

結果、取得できず…IOExceptionではなくてNullPointerExceptionになるのね。
getResourceではなくloadで落ちたようだ。

正しくはこうですね。

AnchorPane pane = FXMLLoader.load(getClass().getResource("/fxml/welcomeScreen.fxml"));

リソースの指定で頭に「/」を付けたら絶対パス、付けなかったら相対パスでした。

H2 databaseを使ってみたい

言語はJavaGUIJavaFXで実装することが決まった今、次はデータベースを選定しなければならない。(遅い)
自分専用アプリだし使ったことあるしSQLiteにしようかなーと思っていたけど、どうやらH2というデータベースが速いらしい。
組み込みモードもあってファイル一つでOKなようだから速さ求めてないけど使ってみよう。

導入手順

  1. ライブラリを入れる
    公式サイトhttp://www.h2database.comから最新版をダウンロード
    どうせjarファイルにしか用がないからAll platform (zip)をダウンロード
  2. h2-x.x.xxx.jarをProjectのライブラリに登録

たったコレだけで使えるようになる。便利。
早速Project直下に「db」ファイルを作って以下を実行してみる。

db直下に「test.h2.db」というファイルが自動的に生成された。
上手くいったようだ。

生成されたDBの編集

アプリケーションでは新しいデータの入力と一覧表示がしたいだけなので、わざわざテーブルのCreate文やIndexなどを実装したくない。
というわけで、初期設定は直接DBファイルに実施することとした。
※ライブラリとして登録したjarファイルが実はDBマネージャー機能も持っていた。すごい。

  1. h2-x.x.xxx.jarを起動する。
    • jarをjavaに関連付けてるならh2.bat実行。
    • そうでないならコマンドプロンプトから java -jar h2-x.x.xxx.jar を実行
    • Windows以外の手順は知らないけどとにかくjarを実行すれば良い
  2. ブラウザでH2コンソールが開くのでそこでパスを入力
    • 上で指定した「jdbc:h2:*」のやつ。
    • ファイルパスは絶対パスで。「\」は「/」に変換。
  3. あとはSQLステートメントからごりごりSQL発行してやれば良いだけ。便利。