JPA是Java EE5規範之一,是一個orm規範,由廠商來實現該規範。目前有hibernate,OpenJPA,TopLink和EclipseJPA等實現 spring提供三種方法集成JPA:1、LocalEntityManagerFactoryBean:適用於那些僅使用JPA進行數據訪問的項目。 ...
JPA是Java EE5規範之一,是一個orm規範,由廠商來實現該規範。目前有hibernate,OpenJPA,TopLink和EclipseJPA等實現
spring提供三種方法集成JPA:
1、LocalEntityManagerFactoryBean:適用於那些僅使用JPA進行數據訪問的項目。該FactoryBean根據 JPA PersistenceProvider自動檢測配置文件進行工作,一般從“META-INF/persistence.xml”讀取配置信息。這種方式最簡單,但是不能設置Spring中定義的DataSource,且不支持Spring管理的全局事務。不建議使用此方式。這種方法實際上只適用於獨立的應用程式和測試環境(這正是JPA規範設計它的原因)。
在Spring中的配置:
<bean id=”entityManagerFactory” class=”org.springframework.orm.jpa.LocalEntityManagerFactoryBean”> <property name=”persistenceUnitName” value=”persistenceUnit”/> </bean>
2、從JNDI中獲取:用於從Java EE伺服器中獲取指定的EntityManagerFactory,這種方式在Spring事務管理時一般要使用JTA事務管理。
Spring中的配置:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd"> <jee:jndi-lookup id="entityManagerFactory" jndi-name="persistence/persistenceUnit"/> </beans>
在標準的java EE 5啟動過程中,Java EE伺服器自動檢測持久化單元(例如應用程式文件包中的META-INF/persistence.xml) ,以及java ee部署描述符中定義給那些持久化單元命名上下文位置的環境的persistence-unit-ref項(例如web.xml)。
在這種情況下,整個持久化單元部署,包括持久化類的織入(字碼碼轉換)都取決於Java EE伺服器。 JDBC DataSource 通過在META-INF/persistence.xml 文件中的JNDI位置進行定義;EntityManager事務與伺服器的JTA子系統整合。Spring僅僅用獲得的 EntityManagerFactory, 通過依賴註入將它傳遞給應用程式對象,併為它管理事務(一般通過JtaTransactionManager)。
註意,如果在同一個應用程式中使用了多個持久化單元,JNDI獲取的這種持久化單元的bean名稱 應該與應用程式用來引用它們的持久化單元名稱相符(例如@PersistenceUnit和 @PersistenceContext註解)。
在部署到Java EE 5伺服器時使用該方法。關於如何將自定義JPA提供者部署到伺服器,以及允許使用伺服器提供的預設提供者之外的JPA提供者,請查看伺服器文檔的相關說明。
3、LocalContainerEntityManagerFactoryBean:適用於所有環境的FactoryBean,能全面控制EntityManagerFactory配置,非常適合那種需要細粒度定製的環境。
該bean有以下屬性:
persistenceUnitManager:用於獲取JPA持久化單元,預設實現DefaultPersistenceUnitManager用於解決多配置文件情況。
dataSource:用於指定Spring定義的數據源。
persistenceXmlLocation:用於指定JPA配置文件,對於多JPA配置文件情況請選擇設置persistenceUnitManager屬性來解決。
persistenceUnitName:用於指定持久化單元名稱。
persistenceProvider:用於指定持久化實現廠商類,如hibernate為:org.hibernate.ejb.HibernateProvider 類。
jpaVendorAdapter:用於設置JPA實現廠商的特定屬性,如設置hibernate的是否自動生成DDL的屬性generateDdl,這些屬性是廠商特定的,因此最好在這裡設置。目前spring提供HibernateJpaVendorAdapter,OpenJpaVendorAdapter,EclipseJpaVendorAdapter,TopLinkJpaVenderAdapter四個實現。其中最主要的屬性是“database”,用來指定使用的資料庫類型。從而根據資料庫類型決定如何將資料庫特定異常轉換為Spring一致性異常。目前支持以下資料庫:DB2,DERBY,H2,HSQL,INFORMIX,MySQL,Oracle,POSTGRESQL,SQL_SERVER,SYBASE
jpaDialect:用於指定一些高級特性,如事務管理等。目前Spring提供HibernateJpaDialect,OpenJpaDialect,EclipseJpaDialect,TopLinkJpaDialect和DefaultJpaDialect實現。註意DefaultJpaDialect不提供任何功能,因此在使用特定實現廠商的JPA實現時需要指定jpaDialect實現,如使用hibernate就使用HibernateJpaDialect。當指定jpaVendorAdapter屬性時可以不指定jpaDialect,會自動設置相應的JpaDialect實現;
jpaProperties和jpaPropertyMap:指定JPA屬性;如Hibernate中指定是否顯示SQL的“hibernate.show_sql”屬性,對於jpaProperties設置的屬性自動會放進jpaPropertyMap中;
loadTimeWeaver:用於指定LoadTimeWeaver實現,從而允許JPA 載入時修改相應的類文件。具體使用得參考相應的JPA規範實現廠商文檔,如Hibernate就不需要指定loadTimeWeaver。
JPA配置實例:
spring4.2.5
spring-data-jpa 1.10.2.RELEASE
hibernate-core 4.3.7.Final
hibernate-entitymanager 4.3.7.Final
spring-context.xml:
1 <!--JPA 配置 start--> 2 <!-- 實體管理器--> 3 <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 4 <!-- 指定數據源 --> 5 <property name="dataSource" ref="dataSource"/> 6 <property name="persistenceProvider" ref="persistenceProvider" /> 7 8 <!-- 指定Entity實體類包路徑 --> 9 <property name="packagesToScan" > 10 <array> 11 <value>com.path.to.entity</value> 12 <value>path.to.entity</value> 13 </array> 14 </property> 15 <!-- 指定Jpa持久化實現廠商類--> 16 <property name="jpaVendorAdapter"> 17 <bean id="hibernateJpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 18 <property name="generateDdl" value="false" /> 19 <property name="database" value="MYSQL" /> 20 <property name="databasePlatform" value="org.hibernate.dialect.MySQL5InnoDBDialect" /> 21 22 <property name="showSql" value="false" /> 23 </bean> 24 </property> 25 <!-- 指定JPA屬性--> 26 <property name="jpaPropertyMap"> 27 <map> 28 <entry key="hibernate.query.substitutions" value="true 1, false 0" /> 29 <entry key="hibernate.default_batch_fetch_size" value="16" /> 30 <entry key="hibernate.max_fetch_depth" value="2" /> 31 <entry key="hibernate.generate_statistics" value="false" /> 32 <entry key="hibernate.bytecode.use_reflection_optimizer" value="true" /> 33 34 <entry key="hibernate.cache.use_query_cache" value="false" /> 35 <entry key="hibernate.cache.use_second_level_cache" value="false" /> 36 37 <entry key="hibernate.enable_lazy_load_no_trans" value="true"/> 38 <!--資料庫欄位名稱映射規則 acb_id自動轉abcId--> 39 <entry key="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy" /> 40 <!--<entry key="hibernate.hbm2ddl.auto" value="validate"/>--> 41 </map> 42 </property> 43 </bean> 44 <bean id="persistenceProvider" class="org.hibernate.jpa.HibernatePersistenceProvider"/> 45 <!-- dao包--> 46 <jpa:repositories base-package="com.path.to.dao,com.path.to.dao2" repository-impl-postfix="Impl" transaction-manager-ref="transactionManager" entity-manager-factory-ref="entityManagerFactory"/>
LocalContainerEntityManagerFactoryBean:指定使用本地容器管理EntityManagerFactory,從而進行細粒度控制;
dataSource屬性指定使用Spring定義的數據源;
persistenceUnitName指定持久化單元名字,即JPA配置文件中指定的;
persistenceProvider:指定JPA持久化提供商,此處使用Hibernate實現HibernatePersistence類;
jpaVendorAdapter:指定實現廠商專用特性,即generateDdl= false表示不自動生成DDL,database= HSQL表示使用hsqldb資料庫;
jpaDialect:如果指定jpaVendorAdapter此屬性可選,此處為HibernateJpaDialect;