在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.sunitjy.model.entityName" />
<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="persistenceUnitName" value="pro_persistence"></property>-->
<property name="dataSource" ref="dataSource"></property>
<property name="persistenceXmlLocation" value="classpath*:pro_core/jpa_persistence.xml"></property>
<property name="packagesToScan">
<list>
<value>com.paic.lfex.model</value>
<value>com.lfex.sdp.core.model</value>
<value>com.paic.lfex.core.pro</value>
</list>
</property>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
</property>
</bean>
persistence.xml配置文件內容:
<persistence 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_1_0.xsd"
version="1.0">
<persistence-unit name="pro_persistence"
transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
<property name="current_session_context_class" value="thread" />
<!--<property name="hibernate.hbm2ddl.auto" value="update" /> -->
<!--<property name="hibernate.show_sql" value="true" />-->
<!--<property name="hibernate.format_sql" value="true" />-->
</properties>
</persistence-unit>
</persistence>
方式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 3.2.3
以上2種方法都測試通過。