原文位址:http://www.cnblogs.com/taven/p/3351841.html
在Spring 內建 Hibernate 的JPA方式中,需要在persistence配置檔案中定義每一個實體類,這樣非常地不友善,遠哥目前找到了2種方法。
這2種方式都可以實作不用persistence.xml檔案,免去每個Entity都要在persistence.xml檔案中配置的煩惱,但是這種方式Entity實體類的主鍵字段注解@ID要放到 getXXX()方法上,否則不認。
方式1:
修改“LocalContainerEntityManagerFactoryBean”的配置,如下:
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="packagesToScan" value="com.pilicat.data.entity" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.connection.driver_class">${jdbc.driverClassName}</prop>
<prop key="hibernate.connection.url">${jdbc.url}</prop>
<prop key="hibernate.connection.username">${jdbc.username}</prop>
<prop key="hibernate.connection.password">${jdbc.password}</prop>
<prop key="hibernate.c3p0.min_size">10</prop>
<prop key="hibernate.hbm2ddl.auto">true</prop>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
</props>
</property>
</bean>
方式1沒有使用 persistence 配置檔案,注意咯!
方式2:
<property name="dataSource" ref="dataSource" />
<property name="persistenceXmlLocation" value="classpath:persistence-app.xml" />
<!-- <property name="persistenceUnitName" value="pilicat_app_jpa" /> -->
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="databasePlatform" value="${hibernate.dialect}" />
<property name="generateDdl" value="false" />
persistence-app.xml配置檔案内容:
<?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="pilicat_app_jpa" transaction-type="RESOURCE_LOCAL">
<properties>
<property name="hibernate.max_fetch_depth" value="3" />
<property name="hibernate.jdbc.fetch_size" value="50" />
<property name="hibernate.jdbc.batch_size" value="50" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="false" />
</properties>
</persistence-unit>
</persistence>
方式2使用了 persistence 配置檔案,去掉“persistenceUnitName”屬性,添加“packagesToScan”屬性,persistence.xml配置檔案中的persistence-unit名字照樣保留,但是 persistence 配置檔案中不需要對實體類進行配置,會自動識别。
為什麼去掉“persistenceUnitName”屬性就可以自動識别實體了呢?看一下Spring的源碼就知道了:
類名:org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager
代碼段:
<code>private</code> <code>List<SpringPersistenceUnitInfo> readPersistenceUnitInfos() {</code>
<code> </code><code>List<SpringPersistenceUnitInfo> infos =</code><code>new</code> <code>LinkedList<SpringPersistenceUnitInfo>();</code>
<code> </code><code>boolean</code> <code>buildDefaultUnit = (</code><code>this</code><code>.packagesToScan !=</code><code>null</code> <code>||</code><code>this</code><code>.mappingResources !=</code><code>null</code><code>);</code>
<code> </code><code>PersistenceUnitReader reader =</code><code>new</code> <code>PersistenceUnitReader(</code><code>this</code><code>.resourcePatternResolver,</code><code>this</code><code>.dataSourceLookup);</code>
<code> </code><code>SpringPersistenceUnitInfo[] readInfos = reader.readPersistenceUnitInfos(</code><code>this</code><code>.persistenceXmlLocations);</code>
<code> </code><code>for</code> <code>(SpringPersistenceUnitInfo readInfo : readInfos) {</code>
<code> </code><code>infos.add(readInfo);</code>
<code> </code><code>if</code> <code>(</code><code>this</code><code>.defaultPersistenceUnitName !=</code><code>null</code> <code>&&</code>
<code> </code><code>this</code><code>.defaultPersistenceUnitName.equals(readInfo.getPersistenceUnitName())) {</code>
<code> </code><code>buildDefaultUnit =</code><code>false</code><code>;</code>
<code> </code><code>}</code>
<code> </code><code>}</code>
<code> </code><code>if</code> <code>(buildDefaultUnit) {</code>
<code> </code><code>infos.add(buildDefaultPersistenceUnitInfo());</code>
<code> </code><code>return</code> <code>infos;</code>
<code>}</code>
注意看這個源碼的方法,defaultPersistenceUnitName 變量如果不為空,并且等于 persistence 配置檔案中的持久化單元名稱,則buildDefaultUnit就為false,buildDefaultUnit 如果為 false,是不會執行 buildDefaultPersistenceUnitInfo() 方法的,而 buildDefaultPersistenceUnitInfo() 方法是根據我們定義的 packagesToScan 去自動掃描Entity實體類的。
注:我使用的是 Spring 3.2.4
以上2種方法都測試通過,還有沒有更簡單的辦法呢?你也可以将您的方式告訴遠哥,或在遠哥的部落格下方留言,歡迎大家交流分享,謝謝。