spring jpa 配置詳解

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

如下介紹Spring JPA 3種配置方式:spring

  • LocalEntityManagerFactoryBean:

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

    在Spring中的配置:數據庫

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

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

    </bean>

 

  • 從JNDI中獲取EntityManagerFactory

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

    Spring中的配置:spring-mvc

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

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

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

 

  • LocalContainerEntityManagerFactoryBean

適用於全部環境的FactoryBean,能全面控制EntityManagerFactory配置,很是適合那種須要細粒度定製的環境。原生的jpa的配置信息是必須放在META-INF目錄下面的,而且名字必須叫作persistence.xml,這個叫作persistence-unit,就叫作持久化單元。

如下配置採用Spring+JPA整合配置,沒在單獨的persistence.xml配置文件。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
	   xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
	   xmlns:context="http://www.springframework.org/schema/context"
	   xmlns:p="http://www.springframework.org/schema/p"
	   xmlns:jpa="http://www.springframework.org/schema/data/jpa"
	   xsi:schemaLocation="
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
        http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd ">

	<!--i18n國際化配置-->
	<bean id="messageSource"
		  class="org.springframework.context.support.ResourceBundleMessageSource"
		  p:basename="Messages">
	</bean>

	<!--@Controller, @Service, @Configuration />-->
	<context:component-scan base-package="com.XXX.service" />
	<mvc:resources mapping="/resources/**" location="/resources/" />
	<mvc:default-servlet-handler/>
	
	<mvc:annotation-driven />
	<context:annotation-config />

	<!-- 啓動對@AspectJ註解的支持:使用cglib進行動態代理  -->
	<aop:aspectj-autoproxy proxy-target-class="true" />

	<!-- 數據庫配置  -->
	    <!-- 數據源 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <property name="driverClassName" value="${driver}" />
        <property name="url" value="${url}" />
        <property name="username" value="${userName}" />
        <property name="password" value="${password}" />
        <property name="initialSize" value="${druid.initialSize}" />
        <property name="maxActive" value="${druid.maxActive}" />
        <property name="maxIdle" value="${druid.maxIdle}" />
        <property name="minIdle" value="${druid.minIdle}" />
        <property name="maxWait" value="${druid.maxWait}" />
        <property name="removeAbandoned" value="${druid.removeAbandoned}" />
        <property name="removeAbandonedTimeout" value="${druid.removeAbandonedTimeout}" />
        <property name="timeBetweenEvictionRunsMillis" value="${druid.timeBetweenEvictionRunsMillis}" />
        <property name="minEvictableIdleTimeMillis" value="${druid.minEvictableIdleTimeMillis}" />
        <property name="validationQuery" value="${druid.validationQuery}" />
        <property name="testWhileIdle" value="${druid.testWhileIdle}" />
        <property name="testOnBorrow" value="${druid.testOnBorrow}" />
        <property name="testOnReturn" value="${druid.testOnReturn}" />
        <property name="poolPreparedStatements" value="${druid.poolPreparedStatements}" />
        <property name="maxPoolPreparedStatementPerConnectionSize" value="${druid.maxPoolPreparedStatementPerConnectionSize}" />
        <property name="filters" value="${druid.filters}" />
    </bean>

	<!--JPA 配置 start-->
	<!-- 實體管理器-->
	<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<!-- 指定數據源 -->
		<property name="dataSource" ref="dataSource"/>
		<!-- 指定Entity實體類包路徑 -->
		<property name="packagesToScan" >
			<array>
				<value>com.XXX.entity</value>
			</array>
		</property>
		<!-- 指定Jpa持久化實現廠商類-->
		<property name="jpaVendorAdapter">
			<bean id="hibernateJpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
				<property name="generateDdl" value="false" />
				<property name="database" value="MYSQL" />
				<property name="databasePlatform" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
				<!-- <property name="showSql" value="true" /> -->
			</bean>
		</property>
		<!-- 指定JPA屬性-->
		<property name="jpaPropertyMap">
			<map>
				<entry key="hibernate.query.substitutions" value="true 1, false 0" />
				<entry key="hibernate.default_batch_fetch_size" value="16" />
				<entry key="hibernate.max_fetch_depth" value="2" />
				<entry key="hibernate.generate_statistics" value="true" />
				<entry key="hibernate.bytecode.use_reflection_optimizer" value="true" />
				<entry key="hibernate.cache.use_second_level_cache" value="false" />
				<entry key="hibernate.cache.use_query_cache" value="false" />
			</map>
		</property>
	</bean>
	<!-- 事務管理器 -->
	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="entityManagerFactory" />
	</bean>
	<!-- 支持註解方式聲明式事務 -->
	<tx:annotation-driven transaction-manager="transactionManager"  proxy-target-class="true" />
	<!-- dao包-->
	<jpa:repositories base-package="com.XXX.dao" repository-impl-postfix="Impl" transaction-manager-ref="transactionManager" entity-manager-factory-ref="entityManagerFactory"/>
	
    <!-- 事務 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="*" />
            <tx:method name="get*" read-only="true" />
            <tx:method name="find*" read-only="true" />
            <tx:method name="select*" read-only="true" />
            <tx:method name="delete*" propagation="REQUIRED" />
            <tx:method name="update*" propagation="REQUIRED" />
            <tx:method name="add*" propagation="REQUIRED" />
            <tx:method name="insert*" propagation="REQUIRED" />
        </tx:attributes>
    </tx:advice>

    <!-- 事務入口 -->
    <aop:config>
        <aop:pointcut id="allServiceMethod" expression="execution(* your service implements package.*.*(..))" />
        <aop:advisor pointcut-ref="allServiceMethod" advice-ref="txAdvice" />
    </aop:config>
   <!--JPA 配置 end-->

	<!--view配置-->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/views/" />
		<property name="suffix" value=".jsp" />
	</bean>

</beans>

該bean有如下屬性:

dataSource:用於指定Spring定義的數據源。

persistenceProvider:用於指定持久化實現廠商類,如hibernate爲:org.hibernate.ejb.HibernateProvider 類。


jpaVendorAdapter:用於設置JPA實現廠商的特定屬性,如設置hibernate的是否自動生成DDL的屬性generateDdl,這些屬性是廠商特定的,所以最好在這裏設置。

目前spring提供HibernateJpaVendorAdapter,OpenJpaVendorAdapter,EclipseJpaVendorAdapter,TopLinkJpaVenderAdapter四個實現。

hibernate.show_sql =true:表示在日誌系統debug級別下將打印全部生成的SQL。

其中最主要的屬性是「database」,用來指定使用的數據庫類型。目前支持如下數據庫:DB2,DERBY,H2,HSQL,INFORMIX,MYSQL,ORACLE,POSTGRESQL,SQL_SERVER,SYBASE。

jpaProperties和jpaPropertyMap:指定JPA屬性;對於jpaProperties設置的屬性自動會放進jpaPropertyMap中; jpaDialect:用於指定一些高級特性,如事務管理等。目前Spring提供HibernateJpaDialect,OpenJpaDialect,EclipseJpaDialect,TopLinkJpaDialect和DefaultJpaDialect實現。注意DefaultJpaDialect不提供任何功能,所以在使用特定實現廠商的JPA實現時須要指定jpaDialect實現,如使用hibernate就使用HibernateJpaDialect。當指定jpaVendorAdapter屬性時能夠不指定jpaDialect,會自動設置相應的JpaDialect實現; jpaVendorAdapter:指定實現廠商專用特性,即generateDdl= false表示不自動生成DDL,database= HSQL表示使用hsqldb數據庫;  

相關文章
相關標籤/搜索