Spring框架(JavaEE开发进阶Ⅲ)—Spring与Java持久化API

一、主要内容

1、配置实体管理器工厂
2、编写基于JPA的DAO

二、前言

1、Java持久化API(JPA)诞生于EJB 2实体Bean的废墟之上,成为新一代Java持久化标准
2、JPA是基于POJO的持久化机制,从Hibernate和Java数据对象(JDO)上借鉴很多理念并加入了Java5注解特性
3、在Spring中使用JPA,首先要在Spring应用上下文将实体管理器工厂(entity manager factory)按Bean的形式进行配置

三、配置实体管理器工厂

1、基于JPA的应用使用EntityManagerFactory的实现类获取EntityManager实例
2、JPA定义了两种类型的实体管理器
1)应用程序管理类型(Application-managed)
程序负责打开、关闭实体管理器并在事务中对其进行控制,该方式的实体管理器适合于不运行在JavaEE容器中的独立应用程序
2)容器管理类型(Container-managed)
实体管理器直接通过注入或JNDI来获取。容器负责配置实体管理器工厂。这种类型的实体管理器适合用于JavaEE容器
3、区别在于:EntityManager的创建和管理方式
1)应用程序管理类型的由EntityManagerFactory创建
2)容器管理类型的通过PersistenceProvider的createContainerEntityManagerFactory()方式获得
4、两种方式下,都由Spring负责管理EntityManager
5、两种实体管理器工厂分别由对应的Spring工厂Bean创建
1)LocalEntityManagerFactoryBean生成应用程序管理类型的EntityManangerFactory
2)LocalContainerEntityManagerFactoryBean生成容器管理类型的EntityManagerFactory
6、Spring提供的JPATemplate隐藏了处理EntityManagerFactory的细节,可以只关注数据访问
7、使用应用程序管理类型的JPA
1)位于类路径下的META-INF目录的persistence.xml配置文件,用于定义若干个持久化单元(同一个数据源下的若干个持久化类)
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
    <persistence-unit name="myTwitterPU">
        <class>com.iotek.myTwitter.domain.User</class>
        <class>com.iotek.myTwitter.domain.Message</class>
        <properties>
            <property name="toplink.jdbc.driver" value="oracle.jdbc.driver.OracleDriver"/>
            <property name="toplink.jdbc.url" value="jdbc:oracle:thin:@127.0.0.1:1521:xe"/>
            <property name="toplink.jdbc.user" value="system"/>
            <property name="toplink.jdbc.password" value="iotek"/>
        </properties>
    </persistence-unit>
</persistence>
<bean id="emf" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="myTwitterPU"/>
</bean>
8、使用容器管理类型的JPA
1)在容器中运行时,可使用容器提供的信息来生成EntityManagerFactory
2)将数据源信息配置在Spring应用上下文中(而不是persistence.xml)
<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="jpaVendorAdapter" ref="jpaVendorAdapter"/>
</bean>
3)直接使用Spring配置的数据源来设置dataSource
4)jpaVendorAdapter属性用于指定厂商的JPA实现
<bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vender.HibernateJpaVendorAdapter">
    <property name="database" value="ORACLE"/>
    <property name="showSql" value="true"/>
    <property name="generateDdl" value="false"/>
    <property name="databasePlatform" value="org.hibernate.dialect.OracleDialect"/>
</bean>

四、编写基于JPA的DAO

1、Spring对JPA集成也提供了JpaTemplate模版及对应的支持类JpaDaoSupport。但为了实现纯JPA方式,基于模版的JPA被弃用
2、纯JPA方式胜过基于模版JPA,关注如何构建“无Spring”(Spring-free)的JPA DAO
3、以下示例代码展现不使用Spring JpaTemplate的JPA DAO

4、示例代码说明
1)em字段上使用了@PersistentContext注解,表明需要将一个EntityManager实例注入到em上。为了在Spring中实现EntityManager注入,需要在Spring应用上下文中配置一个PersistenceAnnotationBeanPostProcessor

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>
2)@Transaction注解表明这个DAO中的持久化方法是在事务上下文中执行的
3)@Repository注解的作用与Hibernate上下文Session的DAO处一样,由于没有模版类来处理异常,需要为DAO添加@Repository注解,这样PersistenceExceptionTranslationPostProcessor就知道要将该Bean产生的异常转换成Spring的统一数据访问异常
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值