😀
Spring4、JPA2.1で複数のorm.xmlを定義する方法
はじめに
下記のように複数の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&characterEncoding=UTF-8&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