(笔记)Spring实战_征服数据库(5)_Spring与Java持久化API
Java持久化API(Java Persistence API,JPA)诞生在EJB2实体Bean的废墟之上,并成为下一代Java持久化标准。JPA是基于POJO的持久化机制,它从Hibernate和Java数据对象(Java Data Object,JDO)上借鉴了很多理念并加入了Java 5注解的特性。
在Spring中使用JPA的第一步是要在Spring应用上下文中将实体管理器工厂(entity manager factory)按照Bean的形式来进行配置。
1.配置实体管理器工厂
基于JPA的应用程序使用EntityManagerFactory的实现类来获取EntityManager实例。JPA定义了两种类型的实体管理器:
(1)应用程序管理类型:当应用程序向实体管理器工厂直接请求实体管理器时,工厂会创建一个实体管理器。在这种模式下,程序要负责打开和关闭实体管理器并在事务中对其进行控制。
(2)容器管理类型:实体管理器由Java EE创建和管理。应用程序根本不与实体管理器工厂打交道。相反,实体管理器直接通过注入或JNDI来获取。容器负责配置实体管理器工厂。这种类型的实体管理器最适合用于Java EE容器。
以上两种实体管理器实现了同一个EntityManager接口。应用程序管理类型的EntityManager是由EntityManagerFactory创建的,而后者是通过PersistenceProvider的createEntityManagerFactory()方法得到的。与此相对,容器管理类型的EntityManagerFactory是通过PersistenceProvider的createContainerEntityManagerFactory()方法获得的。
不管你希望使用哪种EntityManagerFactory,Spring都会负责管理EntityManager。
这两种实体管理器工厂分别由对应的Spring工厂Bean创建:
LocalEntityManagerFactoryBean生成应用程序管理类型的EntityManagerFactory
LocalContainerEntityManagerFactoryBean生成容器管理类型的EntityManagerFactory
选择应用程序管理类型的还是容器管理类型的EntityManagerFactory,对于基于Spring的应用程序来讲是完全透明的。应用程序管理类型和容器管理类型的实体管理器工厂之间唯一值得关注的区别是,在Spring应用上下文中如何进行配置。
使用应用程序管理类型的JPA
它的绝大部分配置来源于一个名为persistence.xml的配置文件。这个文件必须位于类路径下的META-INF目录下。persistence.xml的作用在于定义一个或多个持久化单元。持久化单元是同一个数据源下的一个或多个持久化类。
参考:http://blog.csdn.net/qq208617107/article/details/51581636
Spitter.java
package com.springinaction.jpa.pojo;import java.math.BigDecimal;import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;@Entity
@Table(name = "SPITTER", schema = "SPRING")
public class Spitter implements java.io.Serializable
{private static final long serialVersionUID = -2282127144584390464L;private BigDecimal id;private String username;private String password;private String fullname;private String email;public Spitter(){}public Spitter(BigDecimal id, String username, String password, String fullname, String email){this.id = id;this.username = username;this.password = password;this.fullname = fullname;this.email = email;}@Id@Column(name = "ID", unique = true, nullable = false, precision = 22, scale = 0)public BigDecimal getId(){return this.id;}public void setId(BigDecimal id){this.id = id;}@Column(name = "USERNAME", nullable = false, length = 20)public String getUsername(){return this.username;}public void setUsername(String username){this.username = username;}@Column(name = "PASSWORD", nullable = false, length = 20)public String getPassword(){return this.password;}public void setPassword(String password){this.password = password;}@Column(name = "FULLNAME", nullable = false, length = 50)public String getFullname(){return this.fullname;}public void setFullname(String fullname){this.fullname = fullname;}@Column(name = "EMAIL", nullable = false, length = 50)public String getEmail(){return this.email;}public void setEmail(String email){this.email = email;}}
persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence 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"version="1.0"><persistence-unit name="spitterPU"><provider>org.hibernate.ejb.HibernatePersistence</provider><class>com.springinaction.jpa.pojo.Spitter</class><properties><properties><property name="hibernate.connection.driver_class" value="oracle.jdbc.driver.OracleDriver" /><property name="hibernate.connection.url" value="jdbc:oracle:thin:@localhost:1521:orcl" /><property name="hibernate.connection.username" value="spring" /><property name="hibernate.connection.password" value="spring" /><property name="hibernate.show_sql" value="true" /></properties>properties></persistence-unit></persistence>
spring-spitter.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:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><bean id="emf"class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"><property name="persistenceUnitName" value="spitterPU" /></bean></beans>
pom.xml
<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-entitymanager</artifactId><version>3.3.1.ga</version></dependency>
创建应用程序管理类型的EntityManagerFactory都是在persistence.xml中进行的。
在应用程序管理的场景下(不涉及Spring时),完全由应用程序本身来负责获取EntityManagerFactory,这是通过JPA实现的PersistenceProvider做到的。
使用容器管理类型的JPA
将D:\jboss-4.2.2.GA\jboss-4.2.2.GA\lib\concurrent.jar添加到项目中。
spring-spitter.xml
<bean id="emf_annotation"class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"><property name="dataSource" ref="dataSource" /><property name="jpaVendorAdapter" ref="jpaVendorAdapter" /></bean><bean id="jpaVendorAdapter"class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"><property name="database" value="ORACLE" /><property name="showSql" value="true" /><property name="generateDdl" value="false" /><property name="databasePlatform" value="org.hibernate.dialect.Oracle10gDialect" /></bean><bean id="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /><property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl" /><property name="username" value="spring" /><property name="password" value="spring" /></bean>
2.编写基于JPA的DAO
Spring对JPA集成也提供了JpaTemplate模板以及对应的支持类JpaDaoSupport。但是,为了实现更纯粹的JPA方式,基于模板的JPA已经被弃用了。
pom.xml
<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>3.1.0.GA</version></dependency><!-- 修改版本 --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.5.8</version></dependency>
spring-spitter.xml
<context:component-scan base-package="com.springinaction.jpa" /><beanclass="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /><beanclass="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" /><bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager"><property name="entityManagerFactory" ref="emf_annotation" /></bean><tx:annotation-driven transaction-manager="txManager" />
需要注意的是em属性上使用了@PersistenceContext注解。简单来讲,这个注解表明需要将一个EntityManager实例注入到em上。为了在Spring中实现EntityManager注入,我们需要在Spring应用上下文中配置一个PersistenceAnnotationBeanPostProcessor。
JpaSpitterDao.java
package com.springinaction.jpa;import java.math.BigDecimal;import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;import com.springinaction.jpa.pojo.Spitter;@Repository("spitterDao")
@Transactional
public class JpaSpitterDao implements SpitterDAO
{@PersistenceContextprivate EntityManager em;public void addSpitter(Spitter spitter){em.persist(spitter);}public Spitter getSpitterById(int id){return em.find(Spitter.class, new BigDecimal(id));}}
Test Demo
@Testpublic void test3(){ApplicationContext ctx = new ClassPathXmlApplicationContext("com/springinaction/jpa/spring-spitter.xml");SpitterDAO dao = (SpitterDAO)ctx.getBean("spitterDao");Spitter spitter = new Spitter();spitter.setId(new BigDecimal(11));spitter.setUsername("Jagger");spitter.setPassword("123456");spitter.setFullname("Jagger S Y CHEN");spitter.setEmail("43970615@XX.com");dao.addSpitter(spitter);}@Testpublic void test4(){ApplicationContext ctx = new ClassPathXmlApplicationContext("com/springinaction/jpa/spring-spitter.xml");SpitterDAO dao = (SpitterDAO)ctx.getBean("spitterDao");dao.getSpitterById(11);}
参考源码:http://download.csdn.net/detail/slowly_come_faster/9645982
(笔记)Spring实战_征服数据库(5)_Spring与Java持久化API相关推荐
- spring(10)通过spring 和 JDBC征服数据库
[0]README 1)本文部分文字描述转自:"Spring In Action(中/英文版)",旨在review "spring(10)通过spring 和 JDBC ...
- Baeldung Java 周评 | 第一百零五弹(关键词:如果 Java 是今天设计的、内容丰富的 Spring 会议、JPA 测试用例模版、高性能 Java 持久化、自动化订购午餐、前端五强)
开篇词 尤金的第 105 篇 Java 周评,诞生了! Spring 以及 Java 相关 如果 Java 是今天设计的:可同步接口 [jooq.org] 关于 Java 中 "可能是什么& ...
- chapter10_通过Spring和JDBC征服数据库_2_配置数据源
在声明模板和Repository之前, 我们需要先在Spring中配置一个数据源用于数据库连接 Spring提供了多种配置数据源bean的方式 (1) JDBC驱动程序定义的数据源 (2) JNDI查 ...
- java性能实战_【从零单排】Java性能排查实战模拟
当线上发生了性能问题时,需要我们快速定位问题.本文模拟了一次内存泄漏,从零教学一步步手动排查. 模拟事故现场 使用如下代码模拟内存泄漏.起了几个问题线程(在不停地创建很大的StringBuilder) ...
- spring实战(第4版读书笔记)
一 spring的核心 1.主要概念 DI能够让相互协作的软件组件保持松散耦合,而面向切面编程(AOP)允许你把遍布应用各处的功能分离出来形成可重用的组件. spring有两类容器实现方式,bean ...
- Spring实战(第3版)
<Spring实战(第3版) > 基本信息 原书名:Spring in Actiong(third edition) 作者: (美)Craig Walls 译者: 耿渊 张卫滨 出版社:人 ...
- Redis成神之路电子版教程已问世,面试题+笔记+项目实战
前言 我想对所有程序员说:除了看视频.做项目来提高自身的技术之外,还有一种提升自己的专业技能就是:多!看!书!(本文内提到的书单笔者整理出了一份电子档作为分享,文末有免费获取方式) 网络框架.中间件. ...
- osgi框架和spring区别_最新100道大厂高频spring面试题附答案
简介 这里是由多位互联网大厂架构师面试整理的出现频率最高的spring相关面试题,并为大家整理了完整的答案,赶紧收藏起来吧! 100道spring高频面试题 Spring概览 1.Spring是什么? ...
- java小马哥百度网盘_思否编程(小马哥):Java 微服务实践 - Spring Boot / Spring Cloud全套,完整版下载 - VIPC6资源网...
小马哥 Java 微服务实践 – Spring Boot 系列 pptx segmentfault-lessons-master 03Java 微服务实践 – Spring Boot 系列(三)Web ...
- 《spring实战第四版》的读书笔记
<spring实战第四版>的读书笔记 1 概述 <Spring实战第四版>描述了Spring4架构的设计,看完了以后,最大感觉是Spring的IOC与aop理念实在是太强大了, ...
最新文章
- 智能车竞赛技术报告 | 智能车视觉 - 青岛工学院 - 青工战斗
- 【java】用户动态代理
- android中TextView显示中文发生乱码的问题
- 物理光学 计算倏逝波/渐逝波在界面上存在的范围
- h5页面的写法_8. 开始构建我们的 index.hbs 页面
- linux mysql授权远程登录,Linux中 MySQL 授权远程连接的方法步骤
- python3 windows console 输出乱码问题
- UWP 保存用户设置
- 采用open***对两台流量卡arm设备进行通讯(公有云)
- 浅谈MyBatis源码工具类之——Reflector类
- 最好用的 7 款 Vue admin 后台管理系统测评
- python里计算x的n次方_用Python解决x的n次方问题
- PS 图片添加水印
- oracle ddl大全,[数据库]Oracle_DDL
- SpringBoot中关于RunWith以及SpringBootTest
- cocos creator切换场景闪退_#Cocos Creator# 为什么音乐音效在场景切换的时候自动停止了?...
- 计算机网络基础知识1
- VBUS引脚外围电路设计
- 关于华为交换机bpdu enable. ntdp enable. ndp enable解析
- 提前揭秘CJ八大看点