IK.AM

@making's tech note


【Spring Advent Calendar 2013 4日目 Spring + JPAをGlassFishで動かす spadc13

🗃 {Programming/Java/Spring/AdventCalendar/2013}
🗓 Updated at 2013-12-03T15:20:43Z  🗓 Created at 2013-12-03T15:20:43Z   🌎 English Page

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日目もおれだ


✒️️ Edit  ⏰ History  🗑 Delete