😀

Spring4、JPA2.1で複数のorm.xmlを定義する方法

2017/01/24に公開

はじめに

下記のように複数のorm.xml(user.xml, userImage.xml)を管理する場合の定義方法について記載します。
本稿でのorm.xmlとはentityやnative-sql等のentity-mappingsを定義するファイルを意味します。
検索すると、META-INF/persistence.xml, META-INF/orm.xmlに関する定義方法の情報が多いですが、
これはJPA単体で使う場合の定義ですので、 Spring4と組み合わせて使う場合は異なる定義が必要になります。

パッケージ構成
ーjava
ーresources
     |
     |_conf
     | |_☓☓☓
     | |_☓☓☓
     |
     |_sql
     | |_user.xml
     | |_userImage.xml
     |
     |_applicationContext.xml

前提

今回は下記バージョンで実施します。
spring-data-jpa: 1.10.5.RELEASE
hibernate-entitymanager: 5.1.0.Final

- maven定義

        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>1.10.5RELEASE</version>
        </dependency>
        <!-- JPA -provider(Hibernate) -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.1.0.Final</version>
        </dependency>

applicationContext.xml定義

下記はapplicationContext.xmlの定義例です。全てDB接続のための設定のためdataSource.xml等のファイルを作成し、importする形でも構いません。
 複数orm.xmlの定義方法はpropertyのmappingResourcesを使用します。作成したorm.xml(今回はuser.xml,userImage.xml)のルート以下のパスを定義します。
orm.xmlを増やす場合、下記に追加する必要があります。

余談ですが使用するorm.xmlが一つの場合,META-INFディレクトリ直下にorm.xmlというファイル名を定義すれば
、下記mappingResourceの定義無しで読み込むことが可能です。

定義例
<jpa:repositories base-package="com.sample.orm.dao"/>
<context:property-placeholder
        location="classpath:dataSource.properties"/>
<!-- mysql -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${jdbc.driver.class}"/>
    <property name="url">
        <value>${jdbc.connect}://${jdbc.host.port}/${jdbc.schema}?useUnicode=true&amp;characterEncoding=UTF-8&amp;connectionCollation=utf8mb4_general_ci</value>
    </property>
    <property name="username" value="${jdbc.user}"/>
    <property name="password" value="${jdbc.pass}"/>
    <property name="maxActive" value="20"/>
    <property name="maxIdle" value="1"/>
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>

<bean id="entityManagerFactory"
      class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <!-- entityディレクトリ定義 -->
    <property name="packagesToScan" value="com.sample.orm.entity"/>
    <property name="dataSource" ref="dataSource"/>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="showSql" value="false"/>
            <property name="generateDdl" value="false"/>
            <property name="database" value="MYSQL"/>
        </bean>
    </property>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
        </props>
    </property>
    <!-- mappingパスを定義 -->
    <property name="mappingResources">
        <list>
            <value>sql/user.xml</value>
            <value>Sql/userImage.xml</value>
        </list>
    </property>
</bean>    

Discussion