Spring模塊詳解之Spring ORM和Spring Transaction詳解
Spring ORM(Object-Relational Mapping)
Spring ORM是Spring框架中用于簡化JPA(Java Persistence API)、Hibernate、JDO(Java Data Objects)和其他ORM工具與Spring框架集成的模塊。它提供了一套統(tǒng)一的API,使得開發(fā)者可以輕松地與各種ORM工具進(jìn)行集成,而不需要直接處理底層的ORM框架細(xì)節(jié)。下面我將詳細(xì)介紹Spring ORM的關(guān)鍵概念和工作機(jī)制。
作用
Spring ORM模塊的主要作用是簡化和規(guī)范數(shù)據(jù)訪問層的開發(fā)。它通過提供模板類和DAO(Data Access Object)支持,使得開發(fā)者可以專注于業(yè)務(wù)邏輯的實(shí)現(xiàn),而不必關(guān)注數(shù)據(jù)訪問層的復(fù)雜性。Spring ORM模塊不僅支持標(biāo)準(zhǔn)的JPA,還支持流行的ORM框架如Hibernate和JDO。
核心組件
LocalSessionFactoryBean
: 這是一個(gè)用于配置Hibernate的工廠bean,它創(chuàng)建一個(gè)SessionFactory
,SessionFactory
是Hibernate中的核心接口,負(fù)責(zé)提供數(shù)據(jù)庫的會話對象(Session)。在Spring中,你可以通過XML或Java配置來定義這個(gè)bean。HibernateTemplate
: 它是Spring提供的一個(gè)簡化Hibernate數(shù)據(jù)訪問的模板類。通過這個(gè)類,開發(fā)者可以避免冗長的Hibernate會話管理代碼,直接執(zhí)行CRUD(創(chuàng)建、讀取、更新、刪除)操作。JpaTemplate
: 類似于HibernateTemplate
,但用于JPA。它簡化了JPA EntityManager的使用。JpaTransactionManager
: 這是一個(gè)Spring提供的事務(wù)管理器,用于管理JPA的事務(wù)。它使得JPA事務(wù)管理與Spring的聲明式事務(wù)管理相結(jié)合,簡化了事務(wù)的配置和使用。
使用步驟
配置ORM工具:
首先,你需要配置你選擇的ORM工具,如Hibernate或JPA。這通常涉及到配置數(shù)據(jù)庫連接信息、實(shí)體類以及其他相關(guān)設(shè)置。
定義實(shí)體類:
ORM工具依賴于實(shí)體類來映射數(shù)據(jù)庫表。在Spring ORM中,實(shí)體類是普通的Java類,并使用注解或XML來標(biāo)記它們與數(shù)據(jù)庫表的關(guān)系。
配置Spring與ORM的集成:
使用Spring配置文件或Java配置類,將Spring與ORM工具集成。例如,配置LocalSessionFactoryBean
(對于Hibernate)或EntityManagerFactory
(對于JPA)。
使用模板類執(zhí)行數(shù)據(jù)操作:
在DAO層,可以使用HibernateTemplate
或JpaTemplate
類執(zhí)行數(shù)據(jù)操作。Spring ORM模板類簡化了與數(shù)據(jù)庫的交互,處理了會話的打開和關(guān)閉、事務(wù)的啟動和提交等細(xì)節(jié)。
事務(wù)管理:
使用Spring的事務(wù)管理器(如JpaTransactionManager
)管理事務(wù)。通過Spring的聲明式事務(wù)管理,你可以通過注解或XML配置來指定哪些方法需要事務(wù)支持。
事務(wù)管理
Spring ORM與Spring的事務(wù)管理緊密集成。你可以使用Spring的聲明式事務(wù)管理,通過在服務(wù)層方法上使用@Transactional
注解來聲明事務(wù)。Spring將會自動處理事務(wù)的開啟、提交和回滾,確保數(shù)據(jù)的一致性。
代碼演示
展示了如何使用Spring ORM與Hibernate集成
@Configuration @EnableTransactionManagement public class HibernateConfig { @Bean public DataSource dataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/mydb"); dataSource.setUsername("username"); dataSource.setPassword("password"); return dataSource; } @Bean public LocalSessionFactoryBean sessionFactory() { LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); sessionFactory.setDataSource(dataSource()); sessionFactory.setPackagesToScan("com.example.entity"); sessionFactory.setHibernateProperties(hibernateProperties()); return sessionFactory; } @Bean public HibernateTransactionManager transactionManager() { HibernateTransactionManager transactionManager = new HibernateTransactionManager(); transactionManager.setSessionFactory(sessionFactory().getObject()); return transactionManager; } private Properties hibernateProperties() { Properties properties = new Properties(); properties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect"); properties.put("hibernate.show_sql", "true"); return properties; } }
在這個(gè)配置類中,我們配置了數(shù)據(jù)源、Hibernate的SessionFactory
以及Spring的事務(wù)管理器。通過這種方式,我們可以在Spring的服務(wù)層輕松地使用Hibernate進(jìn)行數(shù)據(jù)庫操作,并利用Spring的聲明式事務(wù)管理確保數(shù)據(jù)一致性。
優(yōu)點(diǎn)
- 簡化數(shù)據(jù)訪問層的開發(fā): Spring ORM提供了一致的API,簡化了數(shù)據(jù)訪問層的開發(fā)。
- 集成了事務(wù)管理: Spring ORM與Spring的事務(wù)管理無縫集成,支持聲明式事務(wù)。
- 支持多種ORM框架: Spring ORM不僅支持JPA,還支持Hibernate、JDO等多種ORM工具。
挑戰(zhàn)
- 學(xué)習(xí)曲線: 對于我們初學(xué)者來說,理解Spring ORM與各種ORM工具的集成和配置可能需要一些時(shí)間。
- 與ORM框架的依賴: 盡管Spring ORM簡化了ORM框架的使用,但在使用具體的ORM框架時(shí),開發(fā)者仍需要熟悉該框架的工作原理和配置。
總結(jié)
Spring ORM通過簡化ORM工具與Spring框架的集成,幫助開發(fā)者專注于業(yè)務(wù)邏輯的實(shí)現(xiàn),同時(shí)提供了強(qiáng)大的事務(wù)管理和統(tǒng)一的數(shù)據(jù)訪問API。
Spring Transaction(Spring事務(wù)管理)
該模塊是Spring框架的核心模塊之一,它提供了一種強(qiáng)大而靈活的事務(wù)管理機(jī)制,可以在Java應(yīng)用中處理復(fù)雜的事務(wù)場景。Spring的事務(wù)管理抽象了底層的事務(wù)處理邏輯,支持聲明式和編程式的事務(wù)管理方式,使開發(fā)者可以專注于業(yè)務(wù)邏輯,而不用處理繁瑣的事務(wù)管理細(xì)節(jié)。
事務(wù)的基本概念
事務(wù)是一組要么全部執(zhí)行成功、要么全部失敗的操作單元。在數(shù)據(jù)庫操作中,事務(wù)保證數(shù)據(jù)的一致性、隔離性、持久性和原子性(即ACID屬性)。
- 原子性(Atomicity): 事務(wù)中的操作要么全部完成,要么全部不完成。
- 一致性(Consistency): 事務(wù)開始和結(jié)束時(shí),數(shù)據(jù)都必須處于一致狀態(tài)。
- 隔離性(Isolation): 事務(wù)的執(zhí)行過程不會被其他事務(wù)干擾。
- 持久性(Durability): 事務(wù)一旦提交,結(jié)果就會永久保存。
Spring事務(wù)管理的類型
- 編程式事務(wù)管理: 開發(fā)者在代碼中顯式管理事務(wù)的開始、提交和回滾。這種方式提供了最大的靈活性,但也增加了代碼的復(fù)雜性。
- 聲明式事務(wù)管理: 使用注解或XML配置來聲明事務(wù)的邊界,Spring容器會自動管理事務(wù)的開始、提交和回滾。聲明式事務(wù)管理是Spring事務(wù)管理中最常用的方式。
聲明式事務(wù)管理
聲明式事務(wù)管理是通過@Transactional
注解實(shí)現(xiàn)的。這個(gè)注解可以應(yīng)用在類或者方法上,用來標(biāo)記該類或方法需要事務(wù)支持。
@Service public class MyService { @Transactional public void performTransaction() { // 業(yè)務(wù)邏輯代碼 } }
在上面的示例中,@Transactional
注解聲明performTransaction()
方法在執(zhí)行時(shí)會啟動一個(gè)事務(wù)。如果方法執(zhí)行過程中拋出一個(gè)未捕獲的運(yùn)行時(shí)異常(RuntimeException
),事務(wù)將會自動回滾。如果方法執(zhí)行成功,事務(wù)將會提交。
事務(wù)的傳播行為(Propagation)
事務(wù)傳播行為定義了一個(gè)事務(wù)方法在調(diào)用另一個(gè)事務(wù)方法時(shí)應(yīng)該如何進(jìn)行事務(wù)管理。Spring支持以下幾種傳播行為:
- REQUIRED: 默認(rèn)傳播行為,表示當(dāng)前方法必須在一個(gè)事務(wù)中運(yùn)行。如果當(dāng)前已經(jīng)存在一個(gè)事務(wù),則加入該事務(wù);否則新建一個(gè)事務(wù)。
- REQUIRES_NEW: 總是新建一個(gè)事務(wù)。如果當(dāng)前存在一個(gè)事務(wù),則掛起該事務(wù)。
- NESTED: 如果當(dāng)前已經(jīng)存在事務(wù),則嵌套在該事務(wù)中運(yùn)行;否則新建一個(gè)事務(wù)。嵌套事務(wù)可以獨(dú)立于外部事務(wù)進(jìn)行回滾。
- MANDATORY: 當(dāng)前方法必須在一個(gè)已有事務(wù)中運(yùn)行,如果沒有事務(wù),則拋出異常。
- NOT_SUPPORTED: 當(dāng)前方法不需要事務(wù)。如果當(dāng)前存在事務(wù),則掛起該事務(wù)。
- NEVER: 當(dāng)前方法不需要事務(wù)。如果當(dāng)前存在事務(wù),則拋出異常。
- SUPPORTS: 如果當(dāng)前存在事務(wù),則加入該事務(wù);如果不存在事務(wù),則以非事務(wù)方式運(yùn)行。
事務(wù)的隔離級別(Isolation)
事務(wù)的隔離級別控制了事務(wù)之間的可見性。Spring支持以下幾種隔離級別:
- DEFAULT: 使用底層數(shù)據(jù)庫的默認(rèn)隔離級別。
- READ_UNCOMMITTED: 最低的隔離級別,允許讀取尚未提交的數(shù)據(jù),可能導(dǎo)致臟讀。
- READ_COMMITTED: 只允許讀取已提交的數(shù)據(jù),避免臟讀。
- REPEATABLE_READ: 確保在同一個(gè)事務(wù)中多次讀取的數(shù)據(jù)一致,防止不可重復(fù)讀。
- SERIALIZABLE: 最高的隔離級別,完全隔離,事務(wù)串行執(zhí)行,防止臟讀、不可重復(fù)讀和幻讀。
事務(wù)的回滾規(guī)則
默認(rèn)情況下,Spring只在遇到未捕獲的運(yùn)行時(shí)異常(RuntimeException
)或錯(cuò)誤(Error
)時(shí)才回滾事務(wù)。如果希望在捕獲的異常或檢查異常(CheckedException
)下也回滾,可以通過@Transactional
注解的rollbackFor
屬性來指定。
@Transactional(rollbackFor = Exception.class) public void performTransaction() throws Exception { // 業(yè)務(wù)邏輯代碼 if (someCondition) { throw new Exception("觸發(fā)回滾"); } }
編程式事務(wù)管理
編程式事務(wù)管理使用Spring提供的TransactionTemplate
或PlatformTransactionManager
來手動管理事務(wù)。雖然這種方式提供了更靈活的控制,但一般情況下不建議使用,除非有特殊的需求。
@Service public class MyService { @Autowired private PlatformTransactionManager transactionManager; public void performTransaction() { TransactionTemplate template = new TransactionTemplate(transactionManager); template.execute(status -> { try { // 業(yè)務(wù)邏輯代碼 } catch (Exception e) { status.setRollbackOnly(); } return null; }); } }
事務(wù)管理器
Spring支持多種事務(wù)管理器,根據(jù)使用的持久化技術(shù)選擇合適的事務(wù)管理器:
- DataSourceTransactionManager: 用于JDBC的事務(wù)管理。
- JpaTransactionManager: 用于JPA的事務(wù)管理。
- HibernateTransactionManager: 用于Hibernate的事務(wù)管理。
- JtaTransactionManager: 用于分布式事務(wù)的事務(wù)管理。
事務(wù)管理的配置
Spring事務(wù)管理可以通過XML或Java配置。以下是Java配置的示例:
@Configuration @EnableTransactionManagement public class TransactionConfig { @Bean public DataSourceTransactionManager transactionManager(DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } }
@EnableTransactionManagement
注解啟用了Spring的聲明式事務(wù)管理。
總結(jié)
Spring事務(wù)管理通過抽象底層的事務(wù)處理邏輯,使開發(fā)者可以專注于業(yè)務(wù)邏輯而不必處理復(fù)雜的事務(wù)管理細(xì)節(jié)。聲明式事務(wù)管理提供了一種方便且強(qiáng)大的方式來管理事務(wù),而Spring對事務(wù)傳播行為、隔離級別和回滾規(guī)則的支持,使得它能夠應(yīng)對各種復(fù)雜的事務(wù)場景。
到此這篇關(guān)于Spring模塊詳解Ⅳ(Spring ORM和Spring Transaction)的文章就介紹到這了,更多相關(guān)Spring ORM和Spring Transaction內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
通過實(shí)例解析Java分布式鎖三種實(shí)現(xiàn)方法
這篇文章主要介紹了通過實(shí)例解析Java分布式鎖三種實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07關(guān)于ScheduledThreadPoolExecutor不執(zhí)行的原因分析
這篇文章主要介紹了關(guān)于ScheduledThreadPoolExecutor不執(zhí)行的原因分析,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08springboot+mybatis plus實(shí)現(xiàn)樹形結(jié)構(gòu)查詢
實(shí)際開發(fā)過程中經(jīng)常需要查詢節(jié)點(diǎn)樹,根據(jù)指定節(jié)點(diǎn)獲取子節(jié)點(diǎn)列表,本文主要介紹了springboot+mybatis plus實(shí)現(xiàn)樹形結(jié)構(gòu)查詢,感興趣的可以了解一下2021-07-07一次Jvm old過高的排查過程實(shí)戰(zhàn)記錄
這篇文章主要給大家介紹了一次Jvm old過高的排查過程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11DOM解析XML報(bào)錯(cuò)Content is not allowed in prolog解決方案詳解
這篇文章主要介紹了DOM解析XML報(bào)錯(cuò)解決方案詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10詳解SpringBoot中使用JPA作為數(shù)據(jù)持久化框架
這篇文章主要介紹了SpringBoot中使用JPA作為數(shù)據(jù)持久化框架的相關(guān)知識,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03RestTemplate在Spring或非Spring環(huán)境下使用精講
這篇文章主要為大家介紹了RestTemplate在Spring或非Spring環(huán)境下使用精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03Java Swing JTextArea文本區(qū)域的實(shí)現(xiàn)示例
這篇文章主要介紹了Java Swing JTextArea文本區(qū)域的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12IO流概述分類字節(jié)流寫數(shù)據(jù)三種方式及問題分析
這篇文章主要為大家介紹了IO流概述分類字節(jié)流寫數(shù)據(jù)三種方式及寫數(shù)據(jù)問題分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12