JPA学习笔记-Spring整合JPA

Spring 整合 JPA

三种整合方式:

-LocalEntityManagerFactoryBean:适用于那些仅使用 JPA 进行数据访问的项目,该 FactoryBean 将根据JPA PersistenceProvider 自动检测配置文件进行工作,一般从“META-INF/persistence.xml”读取配置信息,这种方式最简单,但不能设置 Spring 中定义的DataSource,且不支持 Spring 管理的全局事务

-从JNDI中获取:用于从 Java EE 服务器获取指定的EntityManagerFactory,这种方式在进行 Spring 事务管理时一般要使用 JTA 事务管理

-LocalContainerEntityManagerFactoryBean:适用于所有环境的 FactoryBean,能全面控制 EntityManagerFactory 配置,如指定 Spring 定义的 DataSource 等等。

目录结构如图

applicationContext.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" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="
	http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-4.1.xsd
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">

	<!-- 启用注解注入 -->
	<!-- 
	<context:annotation-config />
	 -->
	<!-- 组件扫描 -->
	<context:component-scan base-package="com.jpa"></context:component-scan>
	<!-- 导入资源文件 -->
	<!-- <context:property-placeholder location="classpath:db.properties" /> -->
	<!-- 配置C3P0数据源 -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="user" value="root"></property>
		<property name="password" value=""></property>
		<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
		<property name="jdbcUrl" value="jdbc:mysql:///test"></property>
		<property name="initialPoolSize" value="5"></property>
		<property name="maxPoolSize" value="10"></property>
	</bean>

	<!-- 配置EntityManagerFactory -->
	<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="dataSource" ref="dataSource"></property>
		<!-- 配置 JPA 提供商的适配器. 可以通过内部 bean 的方式来配置 -->
		<property name="jpaVendorAdapter">
			<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"></bean>
		</property>
		<!-- 配置实体类所在的包 -->
		<property name="packagesToScan" value="com.jpa.entities"></property>
		<!-- 配置 JPA 的基本属性. 例如 JPA 实现产品的属性 -->
		<property name="jpaProperties">
			<props>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.format_sql">true</prop>
				<prop key="hibernate.hbm2ddl.auto">update</prop>
			</props>
		</property>
	</bean>

	<!-- 配置 JPA 使用的事务管理器 -->
	<bean id="transactionManager"
		class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="entityManagerFactory"></property>
	</bean>

	<!-- 配置支持基于注解是事务配置 -->
	<tx:annotation-driven transaction-manager="transactionManager"/>

</beans>

Person.java实体类

@Table(name = "jpa_persons")
@Entity
public class Person {
	@GeneratedValue
	@Id
	private Integer id;
	@Column(name = "last_name")
	private String lastName;

	private String email;
	private int age;
	//getter setter
}

PersonDao

@Repository
public class PersonDao {

	//如何获取到和当前事务关联的EntityManager对象?
	//通过@PersistenceContext注解来标记成员变量
	@PersistenceContext
	private EntityManager entityManager;

	public void save(Person person) {
		entityManager.persist(person);
	}
}

PersonService

@Service
public class PersonService {

	@Autowired
	private PersonDao personDao;

	@Transactional
	public void save(Person p1, Person p2) {
		personDao.save(p1);
		int i = 10 / 0;//抛异常,测试事务
		personDao.save(p2);
	}
}

测试

public class JPATest {

	private PersonService personService = null;
	private ApplicationContext applicationContext = null;
	{
		applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		personService = applicationContext.getBean(PersonService.class);
	}

	@Test
	public void testDataSource() {
		DataSource dataSource = applicationContext.getBean(DataSource.class);
		try {
			System.out.println(dataSource.getConnection());
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	@Test
	public void testPersonService() {
		Person p1 = new Person();
		p1.setAge(21);
		p1.setEmail("[email protected]");
		p1.setLastName("SS");

		Person p2 = new Person();
		p2.setAge(24);
		p2.setEmail("[email protected]");
		p2.setLastName("DD");

		System.out.println(personService.getClass().getName());
		personService.save(p1, p2);
	}

}

源码:http://yunpan.cn/cFzde9uLeFLJB  访问密码 1aeb

时间: 2024-08-09 06:32:38

JPA学习笔记-Spring整合JPA的相关文章

spring data jpa学习笔记一:helloworld

在学习 JPA Spring Data之前,我们有必要了解一下JPA和Spring Data. JPA JPA全称Java Persistence API.即java持久化规范.JPA通过注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. Spring Data Spring Data是Spring框架的一个子项目,就像Spring MVC是Spring的一部分一样.使得数据库访问变得方便和快捷.Spring Data 支持JPA. JPA Spring Data J

JPA学习笔记(5)——EntityManager相关

Persistence EntityManagerFactory EntityManager find方法 getReference方法 persist方法 remove方法 merge方法 情况1传入的对象没有id 情况2传入的对象有identityManager的缓存中没有该对象数据库中没有该记录 情况3传入的对象有identityManager的缓存没有该对象数据库中有该记录 情况4传入的对象有identityManager的缓存有该对象 flush方法 refresh方法 clear c

JPA学习笔记(8)——映射一对多关联关系

一对多关联关系 本文有很多和多对一是一样的,因此不会写得非常具体. 有看不懂的.能够參考JPA学习笔记(7)--映射多对一关联关系 Order实体类 package com.jpa.helloworld2; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; imp

spring整合jpa

1.1.  Spring整合jpa 1.1.1.  新建工程 1.1.2.  引入jar包 1.        所使用hibernat版本:hibernate-release-4.3.7.Final,Lib\jpa目录和lib\required目录下所有的jar包, 2.        mysql驱动包 3.        spring版本spring-framework-4.1.3.RELEASE,libs下所有的jar包 4.        tomcat jdbc连接池 tomcat-jdb

spring整合jpa优化

本篇是针对上一篇<spring整合jpa>文章进行优化 1.1.  使用接口代替dao层 1.1.1.   删除IpersonDao和PersonDaoImpl 1.1.2.   新建PersonDao.java PersonDao.java package com.morris.dao; import org.springframework.data.repository.Repository; import com.morris.entity.Person; public interfac

JPA学习---第一节:JPA详解

一.详解 JPA JPA(Java Persistence API)是Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据.他的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate.TopLink等ORM框架各自为营的局面.值得注意的是,JPA是在充分吸收了现有Hibernate.TopLink等ORM框架的基础上发展而来的,具有易于使用.伸缩性强等优点.从目前的开发社区的反应上看,JPA受到了极大的支持

Spring入门---JPA学习笔记

用了一段时间的Spring,到现在也只是处于会用的状态,对于深入一点的东西都不太了解.所以决定开始深入学习Spring. 本文主要记录JPA学习.在学习JPA之前,需要了解一些ORM的概念. ORM概念: 对象关系映射ORM(Object/Relation Mapping)是一种为了解决面向对象和关系数据之间存在互不匹配现象的技术(范式不匹配).简而言之,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到数据库中.本质上是将数据从一种形式转换到另外一种形式.(个人考虑:

Spring Data JPA学习笔记

Spring Data是一个用于简化数据库访问,并支持云服务的开源框架,其主要目标是使得对数据的访问变得方便快捷.可以在几乎不用写实现的情况下,实现对数据的访问和操作.除了CRUD外,还包括如分页.排序等一些常用的功能. Spring Data JPA提供的接口:1:Repository:最顶层的接口,是一个空的接口,目的是为了统一所有Repository的类型,且能让组件扫描的时候自动识别.2:CrudRepository :是Repository的子接口,提供CRUD的功能.3:Paging

JPA学习笔记(2)——创建JPA项目

创建JPA项目 1. 新建java工程 其实也可以直接新建JPA工程,由于我这边创建JPA工程会有点问题,所以我创建java工程,效果是一样的.两者不同在于,JPA工程会帮我们创建jpa的配置文件,java工程则要我们手动创建 如果是直接创建JPA工程,version请选择2.0 2.创建lib文件夹 新建lib文件夹,加入jar包,并且添加到类路径下 3.新建配置文件 在src下创建文件夹META-INF,在该文件夹下创建 persistence.xml 配置persistence.xml(事