EclipseLinkを使ってみる~初めてのORM
O/Rマッパーとやらはとても便利だそうなのであんまり概念とか分かってないけど使ってみる。
エンティティ・クラスを作る
その名のとおりエンティティ。
- プロジェクト右クリック 新規 > データベースからのエンティティ・クラス
- ウィザードが出てくるのでデータベース接続を選択し、クラスを作りたいテーブルを追加する
- 次へ > 次へ で完了
SampleTable.java と SampleTablePK.java が作成された。
できたてはエラーになっていたけどバックグラウンドで eclipselink が依存性に追加され、勝手にエラーが解消した。
コントローラ・クラスを作る
エンティティだけじゃ何もできないのでコントローラ・クラスを追加してみる。
SampleTableJpaController.java が作成された。
ついでに同列にexceptionsパッケージが追加され、例外クラスが生成されている。
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プロジェクトでライブラリの追加
NetBeansからH2 DBに接続する
調べてもちょうど良いサイトが見つからなかったから自分でメモ。
正しいやり方なのかどうかは分からないけど接続はできた。
前提
- H2 DBファイルが生成されていること
*2014/4/19追記
生成されてない場合は新しいファイルが作成される - ドライバjarがあること
ドライバの登録
- サービスタブの データベース > ドライバ を右クリック > 新規ドライバ...
- H2のjarファイル(h2-x.x.xxx.jar)を選択
- ドライバ・クラスは検索を押すと勝手に出てくる
- 名前は自分が認識できれば何でも良い
引越し手続き
あまりの忙しさに引越し作業が捗らない。
色々と手続きをすませたので次回のためにメモ。
前提:東京→神奈川に引越し
電気
東京電力のサイト「お引越しの手続き」より停止・開始の手続きが可能。
お引越しの手続き|東京電力
※お客様番号が必要
どうやらでんき家計簿とやらに入会(無料)しないと手続きできない残念仕様のよう。
なお「引越れんらく帳サービス」にも強制加入となる。必要なければ引越し後に退会しよう。
東電の引越しれんらく帳サービスはガスや水道も同時に手続きできるようだが
自分は電気の手続きを最後にやってしまったため利便性は不明。
入力で建物名がカタカナじゃないことに気づかずエラーでなかなか進めなかった。
なんで漢字はダメなんだ…
ガス
東京ガスのサイト「お引越しの際の手続き」より手続き可能。
東京ガス : お手続き・サポート / お引越しの際の手続き-ガスのご使用開始/中止のお申し込み-
現在の住居はオール電化で契約していないので新しい家の契約のみ。
新旧の住居が東京ガスの場合は一括で手続きできる。
ガスの開閉は立ち会いが必要なので注意すること。
水道
東京水道局のサイト「インターネットでのお手続き」より手続き可能。
サービスメニュー
※お客様番号が必要
新居はお客様番号が分からないため管轄水道局のサービスセンターに電話連絡。
新築でまだ水道局にお客様番号的なものが届いてないらしく手続き不可。
蛇口ひねれば水は使えるようになっているので支払いの手続きなどは新居にある書類送ってくださいとのこと。
郵便転送
郵便物の転送の手続きも忘れずに。日本郵政のサイト「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を使ってみたい
言語はJava、GUIはJavaFXで実装することが決まった今、次はデータベースを選定しなければならない。(遅い)
自分専用アプリだし使ったことあるしSQLiteにしようかなーと思っていたけど、どうやらH2というデータベースが速いらしい。
組み込みモードもあってファイル一つでOKなようだから速さ求めてないけど使ってみよう。
導入手順
- ライブラリを入れる
公式サイトhttp://www.h2database.comから最新版をダウンロード
どうせjarファイルにしか用がないからAll platform (zip)をダウンロード - h2-x.x.xxx.jarをProjectのライブラリに登録
たったコレだけで使えるようになる。便利。
早速Project直下に「db」ファイルを作って以下を実行してみる。
db直下に「test.h2.db」というファイルが自動的に生成された。
上手くいったようだ。
生成されたDBの編集
アプリケーションでは新しいデータの入力と一覧表示がしたいだけなので、わざわざテーブルのCreate文やIndexなどを実装したくない。
というわけで、初期設定は直接DBファイルに実施することとした。
※ライブラリとして登録したjarファイルが実はDBマネージャー機能も持っていた。すごい。