---
title: 【Spring Advent Calendar 2013 4日目 Spring + JPAをGlassFishで動かす spadc13
tags: []
categories: ["Programming", "Java", "Spring", "AdventCalendar", "2013"]
date: 2013-12-03T15:20:43Z
updated: 2013-12-03T15:20:43Z
---

[Spring Advent Calendar][1] 4日目の記事です。

3日目は[@two_pack][2]さんでした。

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


  [1]: http://www.adventar.org/calendars/153
  [2]: http://two-pack-sbs.blogspot.jp/2013/12/spring-advent-calendar-2013-3.html
