RESTEasyとJPAとAngularJSを使ってWebアプリを作ってみる１０（JTAに切り替える）

[RESTEasyとJPAとAngularJSを使ってWebアプリを作ってみる３（persistance.xmlの設定）](http://qiita.com/1roh/items/63ff0d9ee9ef77bdbf5e) でローカルリソースで設定していたものを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 ファイルを作成し、内容は以下のように記述します。

```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 ファイルを作成し、内容は以下のように記述します。

```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 の編集
データソースを追記します。

```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 に変更し、データソースを指定します。

```xml: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 されるようになります。

```java: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](https://github.com/reedex-satake/homework) に上げておきました。