JPA 不在 persistence.xml 文件中配置每一個Entity實體類的2種解決辦法

在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:
修改「LocalContainerEntityManagerFactoryBean」的配置,以下:
 
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="persistenceXmlLocation" value="classpath:persistence-app.xml" />
<!-- <property name="persistenceUnitName" value="pilicat_app_jpa" /> -->
<property name="packagesToScan" value="com.pilicat.data.entity" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="databasePlatform" value="${hibernate.dialect}" />
<property name="generateDdl" value="false" />
</bean>
</property>
 
</bean>
 
 
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>java

 
方式2使用了 persistence 配置文件,去掉「 persistenceUnitName 」屬性,添加「 packagesToScan 」屬性, persistence.xml配置文件中的persistence-unit名字照樣保留,可是 persistence 配置文件中不須要對實體類進行配置,會自動識別。
 
爲何去掉「persistenceUnitName」屬性就能夠自動識別實體了呢?看一下Spring的源碼就知道了:
 
類名:org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager
代碼段:
	private List<SpringPersistenceUnitInfo> readPersistenceUnitInfos() {
		List<SpringPersistenceUnitInfo> infos = new LinkedList<SpringPersistenceUnitInfo>();
		boolean buildDefaultUnit = (this.packagesToScan != null || this.mappingResources != null);
		PersistenceUnitReader reader = new PersistenceUnitReader(this.resourcePatternResolver, this.dataSourceLookup);
		SpringPersistenceUnitInfo[] readInfos = reader.readPersistenceUnitInfos(this.persistenceXmlLocations);
		for (SpringPersistenceUnitInfo readInfo : readInfos) {
			infos.add(readInfo);
			if (this.defaultPersistenceUnitName != null &&
					this.defaultPersistenceUnitName.equals(readInfo.getPersistenceUnitName())) {
				buildDefaultUnit = false;
			}
		}
		if (buildDefaultUnit) {
			infos.add(buildDefaultPersistenceUnitInfo());
		}
		return infos;
	}

注意看這個源碼的方法,defaultPersistenceUnitName 變量若是不爲空,而且等於 persistence 配置文件中的持久化單元名稱,則buildDefaultUnit就爲false,buildDefaultUnit 若是爲 false,是不會執行 buildDefaultPersistenceUnitInfo() 方法的,而 buildDefaultPersistenceUnitInfo() 方法是根據咱們定義的 packagesToScan 去自動掃描Entity實體類的。  spring

 
注:我使用的是 Spring 3.2.4
 
以上2種方法都測試經過,還有沒有更簡單的辦法呢?你也能夠將您的方式告訴遠哥,或在遠哥的博客下方留言,歡迎你們交流分享,謝謝。
相關文章
相關標籤/搜索