Spring Advent Calendar 4日目の記事です。
3日目は@two_packさんでした。
今日はSpring + JPA(Eclipse Link)なWebアプリをGlassFishで動かすための設定メモです。
ポイントは
- データソースをJNDIで取得
- JtaTransactionManagerを設定
- EntityMangerFactoryをJNDIで取得
です。
EclipseLinkの依存関係追加 + persistence.xmlの作成
NetBeans(7.4)で「新規ファイル」→「持続性ユニット」で
- 持続性ユニット名: persistenceUnit
- 永続性プロバイダ: Eclipse Link (JPA 2.1
- データ・ソース: jdbc/todo (事前に作成)
- 表生成の方針: ドロップして作成
を選択します。
pom.xmlにEclipseLinkのdependencyが追加されます。
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>2.5.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>org.eclipse.persistence.jpa.modelgen.processor</artifactId>
<version>2.5.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
persistence.xmlをちょっと変更してSQL出力をONにします。
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="persistenceUnit" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>jdbc/todo</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
<property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
<property name="eclipselink.logging.level.sql" value="FINE" />
<property name="eclipselink.logging.parameters" value="true" />
</properties>
</persistence-unit>
</persistence>
データソースの定義
JNDIから取得します。Bean定義ファイルに以下を追加します。
<jee:jndi-lookup id="dataSource" jndi-name="jdbc/todo" expected-type="javax.sql.DataSource" />
JtaTransactionManagerの定義
Bean定義ファイルに以下を追加します。
<tx:jta-transaction-manager />
JpaTransactionManagerを設定していたら削除します。
EntityManagerFactoryの登録
web.xmlに以下を追加
<persistence-unit-ref>
<persistence-unit-ref-name>persistence/defaultFactory</persistence-unit-ref-name>
<persistence-unit-name>persistenceUnit</persistence-unit-name>
</persistence-unit-ref>
persistence-unit-nameはpersistence.xmlに設定した値。persistence-unit-ref-nameに設定した値がJNDI名になります。
EntityManagerFactoryの定義
Bean定義ファイルに以下を追加します。
<jee:jndi-lookup id="entityManagerFactory" jndi-name="persistence/defaultFactory" expected-type="javax.persistence.EntityManagerFactory"/>
LocalContainerEntityManagerFactoryBean等が定義されていたら削除します。
以上でOK。GlassFishにデプロイすればJPAの管理をJava EEコンテナに任せることが出来ます。トランザクション管理もJTAです。EJBいらないですね!
テストのときだけLocalContainerEntityManagerFactoryBeanに切り替えるといいですね。
今日はここまで。5日目もおれだ