連載
» 2012年12月13日 18時00分 公開

小山博史のJavaを楽しむ(17):JBoss Forgeでアジャイルな対話式開発をやってみた (3/4)

[小山博史,SSS(G)/ガリレオ]

ForgeでDB操作アプリを作ってみよう

 DBアクセスをするプログラムをどのように作るかも気になるところです。先ほどのプログラムをJPAを使ったアプリにすることが簡単にできるので、試してみましょう。

「persistence setup --」コマンドでHibernateを設定

 Forgeを起動して、「simpleapp」プロジェクトへcdコマンドで移動してから、「persistence setup」コマンドを使って、利用するJPAの実装を指定します。ここで、コンソールで「persistence setup --」まで入力してから、[TAB]キーを入力してみましょう。

 次に指定できる候補が表示されるはずです。この[TAB]キー補完機能をうまく利用して、次のように入力しましょう。

$ forge
[no project] forge $ cd simpleapp
[simpleapp] simpleapp $ persistence setup --provider HIBERNATE --container JBOSS_AS7

 ここでは、[provider]に「Hibernate」、[container]に「JBoss AS 7」を指定しました。

JPAフレームワークやアプリケーションサーバは、いろいろ選択できる

 ちなみに、[TAB]キー補完で候補に挙がるものを見て分かる通り、[provider]としては、「OpenJPA」「EclipseLink」も選択可能です。

 また、[container]としては、「GlassFish 3」「JBoss AS 6」カスタムJDBCといった選択肢があります。


 さて、「persistence setup」コマンドを実行すると、次のように試用版のデータソース「java:jboss/datasources/ExampleDS」が用意されます。続いて、JPA 2を使うか、Hibernateの拡張APIを使うかの質問も出てきます。ここでは、いずれもデフォルトのNoで良いので、そのまま[Enter]キーを押しています。指定した結果は「src/main/resources/META-INF/persistence.xml」に保存されます。

***INFO*** Setting transaction-type="JTA"
***INFO*** Using example data source [java:jboss/datasources/ExampleDS]
 ? Do you want to install a JPA 2 metamodel generator? [y/N] 
 ? The JPA provider [HIBERNATE], also supplies extended APIs. Install these as well? [y/N] 
***SUCCESS*** Persistence (JPA) is installed.
Wrote /home/user001/workspace/forge/simpleapp/src/main/resources/META-INF/persistence.xml

Forgeでエンティティ用クラスを作成

 次に使用するエンティティ用クラスを作成します。この結果、「src/main/java/jp/example/simpleapp/model/UserInfo.java」にJavaプログラムが生成されます。パッケージ名はプロジェクトを作成したときに指定したものをベースとした値ですが、他のパッケージ名にするか聞かれるので、そのタイミングで別のものも指定できます。

[simpleapp] simpleapp $ entity --named UserInfo

 Javaプログラムが生成されると自動的にプロンプトが「UserInfo」になる点に注意しましょう。クラス名.javaが表示されているときは、クラスについて指定できます。ここではfieldを追加しましょう。

[simpleapp] UserInfo.java $ field string --named name

 「ls」コマンドを実行すると、UserInfoクラスのフィールド、メソッドの一覧が表示できます。自動でidやversionのフィールドができていたり、「getName()」といったアクセッサメソッドが出来上がっていることが分かります。

[simpleapp] UserInfo.java $ ls
 
[fields]
private::Long::id;          private::String::name;      private::int::version;
 
[methods]
public::equals(Object that)::boolean              public::getId()::Long
public::getName()::String                         public::getVersion()::int
public::hashCode()::int                           public::setId(final Long id)::void
public::setName(final String name)::void          public::setVersion(final int version)::void
public::toString()::String                        

エンティティクラスに対応する画面を用意

 次に、エンティティクラスに対応する画面を用意します。UserInfo.javaがプロンプトに表示されている状態で、scaffold from-entityコマンドを実行します。質問がいくつか表示されますがデフォルトのままでよいので、[Enter]キーを入力します。

[simpleapp] UserInfo.java $ scaffold from-entity

ここまで作成したアプリの中身

 ここまでの結果として、「src」ディレクトリ配下に次のようにJavaソースファイルが作られます。「model」ディレクトリにはエンティティのモデルクラス、「view」ディレクトリには対応するビュークラスが用意されることが分かります。

src/main/java/

└── jp/

  └── example/

    └── simpleapp/

      ├── model/

      │   └── UserInfo.java

      └── view/

        ├── UserInfoBean.java

        └── ViewUtils.java


 表示用のXHTMLファイルは次のようなものが用意されます。作成、検索、表示といった用途のものがあることが分かります。

src/main/webapp/userInfo

├── create.xhtml

├── search.xhtml

└── view.xhtml


 他には、「src/main/webapp/resources/scaffold/pageTemplate.xhtml」や「src/main/webapp/WEB-INF/classes/META-INF/forge.taglib.xml」といったファイルが自動で出力されます。

DB操作アプリを実行

 それでは、ビルド、JBoss AS 7の起動、デプロイという順で実行してみましょう。具体的には次のようにForgeで実行します。

[simpleapp] UserInfo.java $ cd ~/workspace/forge/simpleapp/
[simpleapp] simpleapp $ build
[simpleapp] simpleapp $ as7 start
[simpleapp] simpleapp $ as7 deploy

実行結果

 正しくできていれば、「http://localhost:8080/simpleapp/」をWebブラウザで開くと、左下にUser Infoの文字が表示されているはずです(図6)。

図6 JPAを使ったアプリの初期画面

 これをクリックすると、UserInfoの一覧表示、新規作成、検索ができるページを開けます(図7)。

図7 JPAを使ったアプリの検索画面

 動作確認ができたらJBoss AS 7 は停止しておきましょう。停止すると、エラーが表示されます。これは「java:jboss/datasources/ExampleDS」の設定に原因があります。

[simpleapp] simpleapp $ as7 shutdown

エラーの解消

 「java:jboss/datasources/ExampleDS」が具体的にどのデータベースを利用しているかは、JBoss AS 7の方で管理しています。そのため、エラーを消すためには、「~/applications/jboss-as/standalone/configuration/standalone.xml」にあるデータソースの設定を修正する必要があります。

 具体的には、以下を

<connection-url>jdbc:h2:mem:test;DB_CLOSE_DELAY=-1</connection-url>

 以下のように書き換えます。

<connection-url>jdbc:h2:mem:test;DB_CLOSE_ON_EXIT=FALSE</connection-url>

 使っているDBが試用版でオンメモリに用意されるものなので、ここではそのままエラーを無視しても構いません。

 どうでしょうか、簡単にJPAを利用するJava EEアプリが作成できることが理解できたと思います。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。