RESTEasyとJPAとAngularJSを使ってWebアプリを作ってみる3(persistance.xmlの設定) でローカルリソースで設定していたものをJTAに切り替えたいと思います。
準備
wildfly が使用するモジュールに jdbc の jar を配置します。
MySQL
- wildfly(E:\develop\pleiades\wildfly\wildfly-9.0.2.Final)配下の modules\system\layers\base\com に mysql\jdbc\main ディレクトリを作成します。
- Maven のローカルリポジトリ(E:\develop\maven_repo)から mysql\mysql-connector-java\5.1.24 にある mysql-connector-java-5.1.24.jar を上記のディレクトリにコピーします。
- com\mysql\jdbc\main に module.xml ファイルを作成し、内容は以下のように記述します。
module.xml
<?xml version="1.0" ?>
<module xmlns="urn:jboss:module:1.1" name="com.mysql.jdbc">
<resources>
<resource-root path="mysql-connector-java-5.1.24.jar"/>
</resources>
<dependencies>
<module name="javax.api"/>
<module name="javax.transaction.api"/>
</dependencies>
</module>
Log4jdbc
- wildfly(E:\develop\pleiades\wildfly\wildfly-9.0.2.Final)配下の modules\system\layers\base\net に sf\log4jdbc\main ディレクトリを作成します。
- Maven のローカルリポジトリ(E:\develop\maven_repo)から org\bgee\log4jdbc-log4j2\log4jdbc-log4j2-jdbc4.1\1.16 にある log4jdbc-log4j2-jdbc4.1-1.16.jar を上記のディレクトリにコピーします。
- net\sf\log4jbdc\main に module.xml ファイルを作成し、内容は以下のように記述します。
module.xml
<?xml version="1.0" ?>
<module xmlns="urn:jboss:module:1.1" name="net.sf.log4jdbc">
<resources>
<resource-root path="log4jdbc-log4j2-jdbc4.1-1.16.jar"/>
</resources>
<dependencies>
<module name="javax.api"/>
<module name="javax.transaction.api"/>
<module name="org.slf4j"/>
<module name="com.mysql.jdbc" optional="true"/>
</dependencies>
</module>
standalone.xml の編集
データソースを追記します。
standalone.xml
<datasource jndi-name="java:jboss/datasources/HomeworkDS" pool-name="HomeworkDS" enabled="true" use-java-context="true">
<connection-url>jdbc:log4jdbc:mysql://localhost:3306/homework</connection-url>
<driver>log4jdbc</driver>
<security>
<user-name>db_user</user-name>
<password>db_pass</password>
</security>
</datasource>
<drivers>
<driver name="log4jdbc" module="net.sf.log4jdbc">
<driver-class>net.sf.log4jdbc.sql.jdbcapi.DriverSpy</driver-class>
<xa-datasource-class>net.sf.log4jdbc.sql.jdbcapi.DataSourceSpy</xa-datasource-class>
</driver>
</drivers>
jndi-name を java:jboss/datasources/HomeworkDS にして、データソースを追加しました。
persistance.xml の編集
transaction-type を JTA に変更し、データソースを指定します。
persistance.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="homework" transaction-type="JTA">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<jta-data-source>java:jboss/datasources/HomeworkDS</jta-data-source>
<mapping-file>homework.xml</mapping-file>
<class>homework.entity.Answer</class>
<class>homework.entity.History</class>
<class>homework.entity.Question</class>
<class>homework.entity.Subject</class>
<class>homework.entity.User</class>
<properties>
<property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
</properties>
</persistence-unit>
<persistence-unit name="homework_ut" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<mapping-file>homework.xml</mapping-file>
<class>homework.entity.Answer</class>
<class>homework.entity.History</class>
<class>homework.entity.Question</class>
<class>homework.entity.Subject</class>
<class>homework.entity.User</class>
<properties>
<property name="javax.persistence.jdbc.url" value="jdbc:log4jdbc:mysql://localhost:3306/homework_ut"/>
<property name="javax.persistence.jdbc.user" value="db_user"/>
<property name="javax.persistence.jdbc.password" value="db_pass"/>
<property name="javax.persistence.jdbc.driver" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
</properties>
</persistence-unit>
</persistence>
エンティティマネジャーをDIする
サービスの親クラスに @Staleless アノテーションをつけて、サービスクラスをコンテナ管理にします。
インスタンス変数の entityManager に @PersistenceContext アノテーションをつけると DI されるようになります。
BaseService.java
@Stateless
public class BaseService {
@PersistenceContext(unitName = EMProducer.DEFAULT_UNIT_NAME)
private EntityManager entityManager;
public BaseService() {
super();
}
/**
* 単体テスト用コンストラクタ。
* @param entityManager エンティティマネジャー
*/
public BaseService(EntityManager entityManager) {
super();
this.entityManager = entityManager;
}
ソースコード
とりあえず、一通り実装したものは GitHub に上げておきました。