似非プログラマのうんちく

「似非プログラマの覚え書き」出張版

JPA + EJB + JSF による Web アプリケーション(その 2)

前回の続きで下準備編。

PostgreSQL の下準備

PostgreSQL のインストールとデータベースの作成

ごっそりと割愛。他の人が解説してくれてるよ、きっと(丸投げ)。

データの投入

SQL をぶん投げる。長くなるので折りたたみ。

CREATE TABLE district (
    id   INT         PRIMARY KEY,
    name VARCHAR(30)
);

INSERT INTO district ( id, name ) VALUES (1,'北海道');
INSERT INTO district ( id, name ) VALUES (2,'東北');
INSERT INTO district ( id, name ) VALUES (3,'関東');
INSERT INTO district ( id, name ) VALUES (4,'中部');
INSERT INTO district ( id, name ) VALUES (5,'近畿');
INSERT INTO district ( id, name ) VALUES (6,'中国');
INSERT INTO district ( id, name ) VALUES (7,'四国');
INSERT INTO district ( id, name ) VALUES (8,'九州');
INSERT INTO district ( id, name ) VALUES (9,'沖縄');

CREATE TABLE prefecture (
    id          INT         PRIMARY KEY,
    name        VARCHAR(30),
    district_id INT         REFERENCES district(id)
);

INSERT INTO prefecture ( id, name, district_id ) VALUES (1,'北海道',1);
INSERT INTO prefecture ( id, name, district_id ) VALUES (2,'青森県',2);
INSERT INTO prefecture ( id, name, district_id ) VALUES (3,'岩手県',2);
INSERT INTO prefecture ( id, name, district_id ) VALUES (4,'宮城県',2);
INSERT INTO prefecture ( id, name, district_id ) VALUES (5,'秋田県',2);
INSERT INTO prefecture ( id, name, district_id ) VALUES (6,'山形県',2);
INSERT INTO prefecture ( id, name, district_id ) VALUES (7,'福島県',2);
INSERT INTO prefecture ( id, name, district_id ) VALUES (8,'茨城県',3);
INSERT INTO prefecture ( id, name, district_id ) VALUES (9,'栃木県',3);
INSERT INTO prefecture ( id, name, district_id ) VALUES (10,'群馬県',3);
INSERT INTO prefecture ( id, name, district_id ) VALUES (11,'埼玉県',3);
INSERT INTO prefecture ( id, name, district_id ) VALUES (12,'千葉県',3);
INSERT INTO prefecture ( id, name, district_id ) VALUES (13,'東京都',3);
INSERT INTO prefecture ( id, name, district_id ) VALUES (14,'神奈川県',3);
INSERT INTO prefecture ( id, name, district_id ) VALUES (15,'新潟県',4);
INSERT INTO prefecture ( id, name, district_id ) VALUES (16,'富山県',4);
INSERT INTO prefecture ( id, name, district_id ) VALUES (17,'石川県',4);
INSERT INTO prefecture ( id, name, district_id ) VALUES (18,'福井県',4);
INSERT INTO prefecture ( id, name, district_id ) VALUES (19,'山梨県',4);
INSERT INTO prefecture ( id, name, district_id ) VALUES (20,'長野県',4);
INSERT INTO prefecture ( id, name, district_id ) VALUES (21,'岐阜県',4);
INSERT INTO prefecture ( id, name, district_id ) VALUES (22,'静岡県',4);
INSERT INTO prefecture ( id, name, district_id ) VALUES (23,'愛知県',4);
INSERT INTO prefecture ( id, name, district_id ) VALUES (24,'三重県',5);
INSERT INTO prefecture ( id, name, district_id ) VALUES (25,'滋賀県',5);
INSERT INTO prefecture ( id, name, district_id ) VALUES (26,'京都府',5);
INSERT INTO prefecture ( id, name, district_id ) VALUES (27,'大阪府',5);
INSERT INTO prefecture ( id, name, district_id ) VALUES (28,'兵庫県',5);
INSERT INTO prefecture ( id, name, district_id ) VALUES (29,'奈良県',5);
INSERT INTO prefecture ( id, name, district_id ) VALUES (30,'和歌山県',5);
INSERT INTO prefecture ( id, name, district_id ) VALUES (31,'鳥取県',6);
INSERT INTO prefecture ( id, name, district_id ) VALUES (32,'島根県',6);
INSERT INTO prefecture ( id, name, district_id ) VALUES (33,'岡山県',6);
INSERT INTO prefecture ( id, name, district_id ) VALUES (34,'広島県',6);
INSERT INTO prefecture ( id, name, district_id ) VALUES (35,'山口県',6);
INSERT INTO prefecture ( id, name, district_id ) VALUES (36,'徳島県',7);
INSERT INTO prefecture ( id, name, district_id ) VALUES (37,'香川県',7);
INSERT INTO prefecture ( id, name, district_id ) VALUES (38,'愛媛県',7);
INSERT INTO prefecture ( id, name, district_id ) VALUES (39,'高知県',7);
INSERT INTO prefecture ( id, name, district_id ) VALUES (40,'福岡県',8);
INSERT INTO prefecture ( id, name, district_id ) VALUES (41,'佐賀県',8);
INSERT INTO prefecture ( id, name, district_id ) VALUES (42,'長崎県',8);
INSERT INTO prefecture ( id, name, district_id ) VALUES (43,'熊本県',8);
INSERT INTO prefecture ( id, name, district_id ) VALUES (44,'大分県',8);
INSERT INTO prefecture ( id, name, district_id ) VALUES (45,'宮崎県',8);
INSERT INTO prefecture ( id, name, district_id ) VALUES (46,'鹿児島県',8);
INSERT INTO prefecture ( id, name, district_id ) VALUES (47,'沖縄県',9);

CREATE TABLE city (
    id            INT         PRIMARY KEY,
    name          VARCHAR(30),
    prefecture_id INT         REFERENCES prefecture(id),
    designated    DATE,
    area          DECIMAL(7,2),
    population    INT
);

INSERT INTO city ( id, name, prefecture_id, designated, area, population ) VALUES (1,'札幌市',1,'1972-04-01',1121.12,1921245);
INSERT INTO city ( id, name, prefecture_id, designated, area, population ) VALUES (2,'仙台市',4,'1989-04-01',785.85,1049493);
INSERT INTO city ( id, name, prefecture_id, designated, area, population ) VALUES (3,'さいたま市',11,'2003-04-01',217.49,1229479);
INSERT INTO city ( id, name, prefecture_id, designated, area, population ) VALUES (4,'千葉市',12,'1992-04-01',272.08,963120);
INSERT INTO city ( id, name, prefecture_id, designated, area, population ) VALUES (5,'横浜市',14,'1956-09-01',437.38,3691693);
INSERT INTO city ( id, name, prefecture_id, designated, area, population ) VALUES (6,'川崎市',14,'1972-04-01',142.7,1430773);
INSERT INTO city ( id, name, prefecture_id, designated, area, population ) VALUES (7,'相模原市',14,'2010-04-01',328.83,719412);
INSERT INTO city ( id, name, prefecture_id, designated, area, population ) VALUES (8,'新潟市',15,'2007-04-01',726.1,812458);
INSERT INTO city ( id, name, prefecture_id, designated, area, population ) VALUES (9,'静岡市',22,'2005-04-01',1411.85,714513);
INSERT INTO city ( id, name, prefecture_id, designated, area, population ) VALUES (10,'浜松市',22,'2007-04-01',1558.04,798924);
INSERT INTO city ( id, name, prefecture_id, designated, area, population ) VALUES (11,'名古屋市',23,'1956-09-01',326.43,2266517);
INSERT INTO city ( id, name, prefecture_id, designated, area, population ) VALUES (12,'京都市',26,'1956-09-01',827.9,1473416);
INSERT INTO city ( id, name, prefecture_id, designated, area, population ) VALUES (13,'大阪市',27,'1956-09-01',223.0,2670579);
INSERT INTO city ( id, name, prefecture_id, designated, area, population ) VALUES (14,'堺市',27,'2006-04-01',149.99,842685);
INSERT INTO city ( id, name, prefecture_id, designated, area, population ) VALUES (15,'神戸市',28,'1956-09-01',552.26,1544496);
INSERT INTO city ( id, name, prefecture_id, designated, area, population ) VALUES (16,'岡山市',33,'2009-04-01',789.92,710913);
INSERT INTO city ( id, name, prefecture_id, designated, area, population ) VALUES (17,'広島市',34,'1980-04-01',905.41,1177711);
INSERT INTO city ( id, name, prefecture_id, designated, area, population ) VALUES (18,'北九州市',40,'1963-04-01',488.78,974287);
INSERT INTO city ( id, name, prefecture_id, designated, area, population ) VALUES (19,'福岡市',40,'1972-04-01',341.7,1479433);
INSERT INTO city ( id, name, prefecture_id, designated, area, population ) VALUES (20,'熊本市',43,'2012-04-01',389.54,736010);

WildFly の下準備

WildFly のインストール

ZIP をダウンロードして好きなフォルダに展開するだけ。特に難しいことはない。

JDBC ドライバの配置

WildFly 推奨の方法(jar をデプロイするやり方)については下記リンク参照。
WildFlyでMySQL datarouceの作成 - Qiita

ここでは直接 jar を配置する方法を紹介。なおこの方法だと domain モードで起動したときにサーバごとに設定をしないといけないが、今回は standalone モードでしか動かさないので気にしなくて良い。

WildFly を展開したフォルダの中の modules\system\layers\base\org に新たに postgresql フォルダを作成し、その中に main フォルダを作って、その中に postgresql-9.3-1100.jdbc4.jar をコピーする。そして同フォルダに以下の内容で module.xml を作成する。

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.3" name="org.postgresql">
  <resources>
    <resource-root path="postgresql-9.3-1100.jdbc4.jar" />
  </resources>
  <dependencies>
    <module name="javax.api" />
    <module name="javax.transaction.api" />
    <module name="javax.servlet.api" optional="true" />
  </dependencies>
</module>

JDBC ドライバの登録と DataSource の定義

WildFly をインストールしたフォルダの中の standalone\configuration\standalone.xml を修正して DataSource を定義しておく。

        <subsystem xmlns="urn:jboss:domain:datasources:2.0">
            <datasources>
                <datasource jndi-name="java:jboss/datasources/ExampleDS" pool-name="ExampleDS" enabled="true" use-java-context="true">
                    <connection-url>jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE</connection-url>
                    <driver>h2</driver>
                    <security>
                        <user-name>sa</user-name>
                        <password>sa</password>
                    </security>
                </datasource>
                <!-- 追加ここから -->
                <datasource jta="true" jndi-name="java:jboss/datasources/PostgreSQL/mydb" pool-name="PostgreSQL" enabled="true" use-java-context="true">
                    <connection-url>jdbc:postgresql://localhost:5432/mydb</connection-url>
                    <driver>postgresql</driver>
                    <security>
                        <user-name>****</user-name>
                        <password>****</password>
                    </security>
                </datasource>
                <!-- 追加ここまで -->
                <drivers>
                    <!-- 追加ここから -->
                    <driver name="postgresql" module="org.postgresql"/>
                    <!-- 追加ここまで -->
                    <driver name="h2" module="com.h2database.h2">
                        <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
                    </driver>
                </drivers>
            </datasources>
        </subsystem>

jndi-name は自分でわかるものであればこの通りでなくても良い。connection-url のデータベース名は実際に作成したデータベース名で置き換えること。