首页 > 代码库 > JAP和Spring整合的三种方式

JAP和Spring整合的三种方式

 
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=http://www.mamicode.com/”persistenceUnit”/>

    </bean>

 

获取EntityManagerFactory的方法是使用springframe的LocalContainerEntityManagerFactoryBean。

 

将前面获取EntityManagerFactory的class引用改一下:

        <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
            <property name="persistenceXmlLocation" value="http://www.mamicode.com/classpath:META-INF/persistence.xml"/>
        </bean>

我们只需要配置persistenceXmlLocation这个属性,指定到classpath里面的META-INF/persistence.xml。

这种方式是配置JPA的强大的方法。因为它允许在应用程序中灵活进行本地配置。它支持连接现有JDBC数据源,支持本地事务(RESOURCE_LOCAL)和全局事务(JTA)。

另外,还可以与dataSource一起使用,我们的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/persistencehttp://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="MyPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>

<class>myentiry.UserInfo</class>

</persistence-unit>

</persistence>

spring的applicationContext配置文件:

     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" >
            <property name="driverClassName" value="http://www.mamicode.com/com.microsoft.sqlserver.jdbc.SQLServerDriver" />
            <property name="url" value="http://www.mamicode.com/jdbc:sqlserver://192.168.2.44:1433;databaseName=test" />
            <property name="username" value="http://www.mamicode.com/sa" />
            <property name="password" value="http://www.mamicode.com/sa" />   
            <property name="initialSize" value="http://www.mamicode.com/5" />
            <property name="minIdle" value="http://www.mamicode.com/5" />      
            <property name="maxIdle" value="http://www.mamicode.com/30" />              
            <property name="maxActive" value="http://www.mamicode.com/100" /> 
            <property name="maxWait" value="http://www.mamicode.com/1000" /> 
        </bean>

   <bean id="entityManagerFactory" 
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
            <property name="dataSource" ref="dataSource" />

     <property name="persistenceXmlLocation" value="http://www.mamicode.com/classpath:META-INF/persistence.xml"/>
            <property name="persistenceUnitName" value="http://www.mamicode.com/MyPU" />
            <property name="jpaVendorAdapter">
                <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                    <property name="showSql" value="http://www.mamicode.com/true" />
                    <property name="generateDdl" value="http://www.mamicode.com/false" />
                </bean>
            </property>
        </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配属性相关置提专门取到jpa的配置文件persistence.xml:

 

  persistence.xml:

    <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>

JAP和Spring整合的三种方式