zoukankan      html  css  js  c++  java
  • spring集成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;

  • 相关阅读:
    洛谷 P2831 [NOIP2016]愤怒的小鸟
    洛谷 P1736 创意吃鱼法
    洛谷 P2347 砝码称重 + bitset简析
    洛谷 P3384 [模板] 树链剖分
    洛谷 P1038 [NOIP2012] 借教室
    洛谷 P3959 [NOIP2017]宝藏 题解
    洛谷 AT2167 Blackout 题解
    洛谷 P1246 编码 题解
    C#中ref关键字的用法总结
    C#中的值传递与引用传递(in、out、ref)
  • 原文地址:https://www.cnblogs.com/gsyun/p/7088620.html
Copyright © 2011-2022 走看看