javascript
Spring使用JPA进行Dao层的数据访问以及事务管理
在上篇文章中,我们完成了SSH+JPA+Mysql的整合:
https://blog.csdn.net/a745233700/article/details/81413306
在这篇文章中,我们主要介绍如何通过Spring使用JPA进行Dao层的数据访问以及事务管理:
一、前言:
1、在SSH整合项目中,获取hibernate中的sessionFactory有两种方式:
(1)第一种是手动获取src目录下hibernate.cfg.xml配置文件:(在dao层的代码)
SessionFactory sessionFactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory();
(2)第二种是使用spring注入:
在spring的配置文件applicationContext.xml文件中进行sessionFactory和dataSource的bean的配置,之后在dao层的实现类中定义一个属性为SessionFactory,使用spring注入。
(3)在JPA中的EntityManagerFactory类似于Hibernate中的SessionFactory;EntityManager类似于Session,EntityManager是实体类管理器,是由EntityManagerFactory创建,每一个EntityManagerFactory称为一个持久化单元,每个持久化单元可以认为是一个数据源的映射(数据源可以理解为一个数据库,我们可以在应用服务器中配置不同的数据源,即使用不同的persistenceUtil来映射这些数据源,从而可以实现不同的数据库之间的操作。)
2、同理,在JPA中,获取EntityManagerFactory也是使用这两种方式来实现:
(1)第一种是通过persistence.xml文件手动获取EntityManagerFactory(可以参考上一篇博客,链接在最顶端)
(2)第二种是使用spring注入的方式是实现获取EntityManagerFactory。
二、使用spring注入的方式是实现获取EntityManagerFactory。
1、在spring配置文件创建一个bean标签,目的创建一个EntityManagerFactory,这里不同于sessionFactory的bean,因为这里读取的是src目录下的META-INF目录下的persistence.xml 即JPA的配置文件,所以在下面设置的是持久化单元名"myjpa",对应JPA配置文件中的单元名字。
<!-- SSH与JPA整合:FactoryBean,由LocalSessionFactoryBean改成LocalContainerEntityManagerFactoryBean --><bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"><!-- 读取src目录下META-INF下的persistence.xml,value值是persistence-unit标签的name的值 --><property name="persistenceUnitName" value="myjpa"/> <!-- 数据源 --><property name="dataSource" ref="dataSource" /><!-- 配置JPA提供商的适配器 --><property name="jpaVendorAdapter"><bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"></bean></property><!-- 配置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><!-- 配置实体类所在的路径 --><property name="packagesToScan" value="com.zwp.jpa.domain" /></bean>2、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/persistence_1_0.xsd" version="1.0"> <persistence-unit name="myjpa" transaction-type="RESOURCE_LOCAL"> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" /> <property name="hibernate.max_fetch_depth" value="3" /> </properties> </persistence-unit> </persistence>3、在Dao层设置并注入EntityManagerFactory对象,注入之后,我们就可以获取到EntityManager并直接使用了:
//JPA的Dao层 public class JpaDaoImpl implements JpaDao {//注入EntityManagerFactory对象@Autowired@Qualifier("entityManagerFactory")private EntityManagerFactory entityManagerFactory;@Overridepublic void jpaTest() {EntityManager em= entityManagerFactory.createEntityManager();em.getTransaction().begin();//业务逻辑开始Orders orders=new Orders();orders.setAmount(34f);orders.setOrderid("999");OrderItem orderItem1=new OrderItem();orderItem1.setProductName("篮球");orderItem1.setSellPrice(150f);OrderItem orderItem2=new OrderItem();orderItem2.setProductName("足球");orderItem2.setSellPrice(90f);orders.addOrderItem(orderItem1);orders.addOrderItem(orderItem2);em.merge(orders);//业务逻辑开始结束em.getTransaction().commit();em.close();//entityManagerFactory.close();//这里不需要我们进行关闭} }(1)@Qualifier("entityManagerFactory")注解中的entityManagerFactory对应的是spring配置文件中JPA配置的entityManagerFactory的id属性值。
(2)在这里,可以使用spring的注解,或者是使用bean注入的方式,这里使用的spring的注入进行注入。使用spring注解需要在spring配置文件中添加一个注解的解析器:<context:annotation-config></context:annotation-config>
(3)至此,使用Spring注入EntityManagerFactory,并精心Dao层的数据访问程序就完成了。
三、JPA的事务管理:
首先建立在上面使用的spring注入JPA的基础之上,再加入JPA的事务管理。好处是我们自己不需要手动开启、提交事务和关闭资源,因为这些都是重复的代码,做的事情都是同一样的。所以可以交给事务来管理。
1、在spring配置文件applicationContext.xml中添加事务管理:
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"><property name="entityManagerFactory" ref="entityManagerFactory"></property> </bean><!-- 开启事务注解 --> <!-- 第一步:开启注解驱动;第二步:在service上使用注解 --> <tx:annotation-driven transaction-manager="transactionManager"/>2、在Dao层的类上面加上@Transactional注解,并在类里面定义EntityManager对象,并在其上面使用@PersistenceContext注解,之后就可以直接使用这个EntityManager进行CURD操作。
这个属性的定义是建立在JPA的事务管理之上的,当web容器读取spring配置文件中的EntityManagerFactory后会自动创建一个EntityManager,然后根据在dao类中定义的这个属性进行注入。代码如下:
//JPA的Dao层 @Transactional public class JpaDaoImpl implements JpaDao {//注入EntityManagerFactory对象@Autowired@Qualifier("entityManagerFactory")private EntityManagerFactory entityManagerFactory;//事务管理@PersistenceContextprivate EntityManager em;@Overridepublic void jpaTest() {Orders orders=new Orders();orders.setAmount(34f);orders.setOrderid("999");OrderItem orderItem1=new OrderItem();orderItem1.setProductName("篮球");orderItem1.setSellPrice(150f);OrderItem orderItem2=new OrderItem();orderItem2.setProductName("足球");orderItem2.setSellPrice(90f);orders.addOrderItem(orderItem1);orders.addOrderItem(orderItem2);em.merge(orders);} }加入事务管理之后,我们的Dao层代码就可以减少为上面这样子了,不需要由我们手动开启、提交事务和关闭资源这些重复性工作了,全部交由事务进行管理。
总结
以上是生活随笔为你收集整理的Spring使用JPA进行Dao层的数据访问以及事务管理的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: SSH整合JPA+Mysql
- 下一篇: SpringBoot简介、SpringB