最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring JPA事務(wù)管理與自定義操作實(shí)例解析(最新推薦)

 更新時(shí)間:2024年12月24日 12:08:09   作者:t0_54coder  
在Spring框架中,數(shù)據(jù)持久化操作常常與事務(wù)管理緊密相關(guān),本文將深入探討Spring Data JPA中的事務(wù)管理機(jī)制,并結(jié)合具體實(shí)例,展示如何自定義事務(wù)行為以滿足不同的業(yè)務(wù)需求,感興趣的朋友一起看看吧

在Spring框架中,數(shù)據(jù)持久化操作常常與事務(wù)管理緊密相關(guān)。本文將深入探討Spring Data JPA中的事務(wù)管理機(jī)制,并結(jié)合具體實(shí)例,展示如何自定義事務(wù)行為以滿足不同的業(yè)務(wù)需求。

Spring JPA中的事務(wù)管理

在Spring Data JPA中,默認(rèn)的CrudRepository實(shí)現(xiàn)是SimpleJpaRepository。這個(gè)類通過@Transactional注解支持事務(wù)管理,其中readOnly = true屬性意味著默認(rèn)情況下所有方法都在只讀事務(wù)中執(zhí)行。對(duì)于寫操作,如deleteById,deleteAll等,它們通過@Transactional注解覆蓋了只讀行為,使得這些方法在寫事務(wù)中執(zhí)行。

@Repository
@Transactional(readOnly = true)
public class SimpleJpaRepository<T, ID> implements JpaRepository<T, ID>, JpaSpecificationExecutor<T> {
    @Transactional
    public void deleteById(ID id) {...}
    // 其他寫操作
}

自定義Repository事務(wù)行為

若要自定義事務(wù)設(shè)置,我們可以重寫特定的方法,并添加@Transactional注解。例如,我們可以為deleteById方法設(shè)置一個(gè)超時(shí)時(shí)間:

public interface EmployeeRepository extends CrudRepository<Employee, Long> {
    @Transactional(timeout = 10)
    @Override
    public void deleteById(ID id);
}

在Repository外部使用事務(wù)

在Repository外部使用事務(wù),需要在配置類上添加@EnableTransactionManagement注解:

@Configuration
@ComponentScan
@EnableTransactionManagement
public class AppConfig {
    // ...
}

然后,我們可以在服務(wù)類中使用@Transactional注解來管理事務(wù):

@Service
public class MyExampleBean{
    @Transactional
    public void saveChanges() {
        repo.save(..);
        repo.deleteById(..);
        .....
    }
}

實(shí)例分析

Entity定義

@Entity
public class Employee {
    @Id
    @GeneratedValue
    private Long id;
    @Column(unique = true)
    private String name;
    private String dept;
    private int salary;
    // 省略其他字段和方法
}

Repository定義

public interface EmployeeRepository extends CrudRepository<Employee, Long> {
    @Transactional(timeout = 10)
    @Override
    <S extends Employee> S save(S s);
}

客戶端操作

@Component
public class ExampleClient {
    @Autowired
    private EmployeeRepository repo;
    public void findEmployees() {
        System.out.println(" -- finding all employees --");
        repo.findAll().forEach(System.out::println);
    }
    @Transactional
    public void saveEmployees() {
        repo.save(Employee.create("Mike", "Sale", 1000));
        repo.save(Employee.create("Diana", "Admin", 3000));
        repo.save(Employee.create("Diana", "IT", 3200)); // 這將觸發(fā)異常
    }
}

在上面的saveEmployees方法中,我們嘗試保存具有重復(fù)名稱的員工。由于Employee實(shí)體類中通過@Column(unique = true)指定了唯一列,最后一個(gè)保存調(diào)用將失敗,整個(gè)事務(wù)將回滾。如果不使用@Transactional注解,前兩名員工仍然會(huì)被保存,即整個(gè)保存過程不會(huì)是原子性的。

JavaConfig配置

@EnableJpaRepositories
@ComponentScan
@Configuration
@EnableTransactionManagement
public class AppConfig {
    @Bean
    EntityManagerFactory entityManagerFactory() {
        EntityManagerFactory emf =
                Persistence.createEntityManagerFactory("example-unit");
        return emf;
    }
    @Bean
    public PlatformTransactionManager transactionManager() {
        JpaTransactionManager txManager = new JpaTransactionManager();
        txManager.setEntityManagerFactory(entityManagerFactory());
        return txManager;
    }
}

主類

public class ExampleMain {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context =
                new AnnotationConfigApplicationContext(AppConfig.class);
        ExampleClient exampleClient = context.getBean(ExampleClient.class);
        try {
            exampleClient.saveEmployees();
        } catch (Exception e) {
            System.err.println(e);
        }
        exampleClient.findEmployees();
        EntityManagerFactory emf = context.getBean(EntityManagerFactory.class);
        emf.close();
    }
}

如果不在saveEmployees方法上使用@Transactional注解,那么即使觸發(fā)了唯一性約束異常,前兩名員工的數(shù)據(jù)仍然會(huì)被保存,這違背了事務(wù)的原子性原則。

通過上述分析,我們可以看到Spring JPA事務(wù)管理的靈活性和強(qiáng)大功能,以及如何通過自定義事務(wù)行為來滿足復(fù)雜的業(yè)務(wù)需求。

到此這篇關(guān)于Spring JPA事務(wù)管理與自定義操作實(shí)例解析的文章就介紹到這了,更多相關(guān)Spring JPA事務(wù)管理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot項(xiàng)目啟動(dòng)錯(cuò)誤:找不到或無法加載主類的幾種解決方法

    SpringBoot項(xiàng)目啟動(dòng)錯(cuò)誤:找不到或無法加載主類的幾種解決方法

    本文主要介紹了SpringBoot項(xiàng)目啟動(dòng)錯(cuò)誤:找不到或無法加載主類的幾種解決方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-03-03
  • 圖解Java排序算法之希爾排序

    圖解Java排序算法之希爾排序

    這篇文章主要為大家詳細(xì)介紹了Java排序算法之希爾排序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Java實(shí)現(xiàn)時(shí)間與字符串互相轉(zhuǎn)換詳解

    Java實(shí)現(xiàn)時(shí)間與字符串互相轉(zhuǎn)換詳解

    這篇文章主要為大家詳細(xì)介紹了Java中實(shí)現(xiàn)時(shí)間與字符串互相轉(zhuǎn)換的相關(guān)方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-04-04
  • Java中反射的應(yīng)用

    Java中反射的應(yīng)用

    這篇文章主要介紹了Java中反射的應(yīng)用,通過反射,我們可以在運(yùn)行時(shí)檢查類的屬性、方法和構(gòu)造函數(shù),并且可以在不知道類名的情況下創(chuàng)建對(duì)象、調(diào)用方法和訪問屬性,需要的朋友可以參考下
    2023-10-10
  • Java實(shí)現(xiàn)角色扮演游戲的示例代碼

    Java實(shí)現(xiàn)角色扮演游戲的示例代碼

    這篇文章主要介紹了通過Java語言實(shí)現(xiàn)的自制的角色扮演游戲,選擇兩個(gè)角色,然后進(jìn)行PK,可用來學(xué)習(xí)JAVA的接口,繼承和多態(tài)。需要的可以參考一下
    2022-02-02
  • SpringBoot中使用Quartz管理定時(shí)任務(wù)的方法

    SpringBoot中使用Quartz管理定時(shí)任務(wù)的方法

    這篇文章主要介紹了SpringBoot中使用Quartz管理定時(shí)任務(wù)的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 詳解Java面向?qū)ο笾械睦^承

    詳解Java面向?qū)ο笾械睦^承

    這篇文章主要介紹了詳解Java面向?qū)ο笾械睦^承,繼承提高代碼的復(fù)用性:通過繼承,子類可以直接使用父類的屬性和方法,不需要重復(fù)定義,需要的朋友可以參考下
    2023-05-05
  • jpa 使用@Column來定義字段類型

    jpa 使用@Column來定義字段類型

    這篇文章主要介紹了jpa使用@Column來定義字段類型,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • JDK都出到14了,你有什么理由不會(huì)函數(shù)式編程(推薦)

    JDK都出到14了,你有什么理由不會(huì)函數(shù)式編程(推薦)

    這篇文章主要介紹了JDK都出到14了,你有什么理由不會(huì)函數(shù)式編程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Java Validation Api實(shí)現(xiàn)原理解析

    Java Validation Api實(shí)現(xiàn)原理解析

    這篇文章主要介紹了Java Validation Api實(shí)現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09

最新評(píng)論

绍兴县| 莲花县| 永吉县| 赤峰市| 手游| 贵南县| 云南省| 龙门县| 塔河县| 墨竹工卡县| 临武县| 阳泉市| 两当县| 千阳县| 方城县| 武安市| 临沂市| 织金县| 樟树市| 阳高县| 隆德县| 确山县| 泾川县| 黑河市| 宜昌市| 会泽县| 金门县| 卫辉市| 定结县| 晋州市| 清丰县| 晴隆县| 台东县| 明星| 黔西| 通道| 任丘市| 乌兰察布市| 洛浦县| 清水河县| 阳西县|