日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring使用JPA进行Dao层的数据访问以及事务管理

發(fā)布時間:2024/9/30 javascript 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring使用JPA进行Dao层的数据访问以及事务管理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在上篇文章中,我們完成了SSH+JPA+Mysql的整合:

https://blog.csdn.net/a745233700/article/details/81413306

在這篇文章中,我們主要介紹如何通過Spring使用JPA進行Dao層的數(shù)據(jù)訪問以及事務管理:

?

一、前言:

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層的實現(xiàn)類中定義一個屬性為SessionFactory,使用spring注入。

(3)在JPA中的EntityManagerFactory類似于Hibernate中的SessionFactory;EntityManager類似于Session,EntityManager是實體類管理器,是由EntityManagerFactory創(chuàng)建,每一個EntityManagerFactory稱為一個持久化單元,每個持久化單元可以認為是一個數(shù)據(jù)源的映射(數(shù)據(jù)源可以理解為一個數(shù)據(jù)庫,我們可以在應用服務器中配置不同的數(shù)據(jù)源,即使用不同的persistenceUtil來映射這些數(shù)據(jù)源,從而可以實現(xiàn)不同的數(shù)據(jù)庫之間的操作。)       

2、同理,在JPA中,獲取EntityManagerFactory也是使用這兩種方式來實現(xiàn):

(1)第一種是通過persistence.xml文件手動獲取EntityManagerFactory(可以參考上一篇博客,鏈接在最頂端)

(2)第二種是使用spring注入的方式是實現(xiàn)獲取EntityManagerFactory。

?

?

二、使用spring注入的方式是實現(xiàn)獲取EntityManagerFactory。

1、在spring配置文件創(chuàng)建一個bean標簽,目的創(chuàng)建一個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"/> <!-- 數(shù)據(jù)源 --><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文件:(因為數(shù)據(jù)源在其他地方配置,所有該文件很簡潔)

<?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();//業(yè)務邏輯開始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);//業(yè)務邏輯開始結束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層的數(shù)據(jù)訪問程序就完成了。

?

?

三、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后會自動創(chuàng)建一個EntityManager,然后根據(jù)在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层的数据访问以及事务管理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。