Spring JPA配置講解

 JPA是Java EE5規範之一,是一個orm規範,由廠商來實現該規範。目前有hibernate,OpenJPA,TopLink和EclipseJPA等實現html

    Spring提供三種方法集成JPA:java

一、LocalEntityManagerFactoryBean:適用於那些僅使用JPA進行數據訪問的項目。該FactoryBean根據 JPA PersistenceProvider自動檢測配置文件進行工做,通常從「META-INF/persistence.xml」讀取配置信息。這種方式最簡單,可是不能設置Spring中定義的DataSource,且不支持Spring管理的全局事務。不建議使用此方式。這種方法實際上只適用於獨立的應用程序和測試環境(這正是JPA規範設計它的緣由)。linux

    在Spring中的配置:web

    <bean id=」entityManagerFactory」 class=」org.springframework.orm.jpa.LocalEntityManagerFactoryBean」>spring

       <property name=」persistenceUnitName」 value=」persistenceUnit」/>sql

    </bean>數據庫

 

二、從JNDI中獲取:用於從Java EE服務器中獲取指定的EntityManagerFactory,這種方式在Spring事務管理時通常要使用JTA事務管理服務器

    Spring中的配置:app

<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)。ide

在這種狀況下,整個持久化單元部署,包括持久化類的織入(字碼碼轉換)都取決於Java EE服務器。 JDBC DataSource 經過在META-INF/persistence.xml 文件中的JNDI位置進行定義;EntityManager事務與服務器的JTA子系統整合。Spring僅僅用得到的 EntityManagerFactory, 經過依賴注入將它傳遞給應用程序對象,併爲它管理事務(通常經過JtaTransactionManager)。

注意,若是在同一個應用程序中使用了多個持久化單元,JNDI獲取的這種持久化單元的bean名稱 應該與應用程序用來引用它們的持久化單元名稱相符(例如@PersistenceUnit和 @PersistenceContext註解)。

在部署到Java EE 5服務器時使用該方法。關於如何將自定義JPA提供者部署到服務器,以及容許使用服務器提供的缺省提供者以外的JPA提供者,請查看服務器文檔的相關說明。

 

三、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配置實例:

  persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.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_1_0.xsd">
    <persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL"/>
</persistence>
  persistence.xml中,指定持久化單元名稱和事務類型,其餘在Spring中配置。
 
  applicationContext.xml
  <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="persistenceXmlLocation" value="chapter8/persistence.xml"/>
    <property name="persistenceUnitName" value="persistenceUnit"/>
    <property name="persistenceProvider" ref="persistenceProvider"/>
    <property name="jpaVendorAdapter" ref="jpaVendorAdapter"/>
    <property name="jpaDialect" ref="jpaDialect"/>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.show_sql">true</prop>
        </props>
    </property>
  </bean>
  <bean id="persistenceProvider" class="org.hibernate.ejb.HibernatePersistence"/>
  <bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
    <property name="generateDdl" value="false" />
    <property name="database" value="HSQL"/>
  </bean>
  <bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>
  • LocalContainerEntityManagerFactoryBean:指定使用本地容器管理EntityManagerFactory,從而進行細粒度控制;
  • dataSource屬性指定使用Spring定義的數據源;
  • persistenceXmlLocation指定JPA配置文件爲chapter8/persistence.xml,且該配置文件很是簡單,具體配置徹底在Spring中進行;
  • persistenceUnitName指定持久化單元名字,即JPA配置文件中指定的;
  • persistenceProvider:指定JPA持久化提供商,此處使用Hibernate實現HibernatePersistence類;
  • jpaVendorAdapter:指定實現廠商專用特性,即generateDdl= false表示不自動生成DDL,database= HSQL表示使用hsqldb數據庫;
  • jpaDialect:若是指定jpaVendorAdapter此屬性可選,此處爲HibernateJpaDialect;
  • jpaProperties:此處指定「hibernate.show_sql =true」表示在日誌系統debug級別下將打印全部生成的SQL。

JpaTemplate類:

Spring提供JpaTemplate模板類用於簡化事務管理及常見操做,相似於JdbcTemplate模板類。

 

Reference:

[1] http://www.cnblogs.com/jacksun1978/archive/2012/04/11/2443096.html

相關文章
相關標籤/搜索