欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

Spring JPA中的事務管理

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

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

自定義Repository事務行為

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

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

在Repository外部使用事務

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

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

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

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

實例分析

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方法中,我們嘗試保存具有重復名稱的員工。由于Employee實體類中通過@Column(unique = true)指定了唯一列,最后一個保存調用將失敗,整個事務將回滾。如果不使用@Transactional注解,前兩名員工仍然會被保存,即整個保存過程不會是原子性的。

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ā)了唯一性約束異常,前兩名員工的數據仍然會被保存,這違背了事務的原子性原則。

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

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

相關文章

  • java如何利用FastJSON、Gson、Jackson三種Json格式工具自定義時間序列化

    java如何利用FastJSON、Gson、Jackson三種Json格式工具自定義時間序列化

    本篇文章主要介紹了java如何利用FastJSON、Gson、Jackson三種Json格式工具自定義時間序列化,具有一定的參考價值,有興趣的可以了解一下
    2017-08-08
  • java圖片添加水印實例代碼分享

    java圖片添加水印實例代碼分享

    這篇文章主要為大家詳細介紹了java圖片添加水印實例代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2015-12-12
  • SpringCloud鏈路追蹤組件Sleuth配置方法解析

    SpringCloud鏈路追蹤組件Sleuth配置方法解析

    這篇文章主要介紹了SpringCloud鏈路追蹤組件Sleuth配置方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • springboot整合mybatis流程詳解

    springboot整合mybatis流程詳解

    這篇文章主要為大家詳細介紹了springboot整合mybatisplus的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-05-05
  • Hibernate映射解析之關聯映射詳解

    Hibernate映射解析之關聯映射詳解

    所謂關聯映射就是將關聯關系映射到數據庫里,在對象模型中就是一個或多個引用。下面這篇文章詳細的給大家介紹了Hibernate映射解析之關聯映射的相關資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-02-02
  • Java求解二叉樹的最近公共祖先實例代碼

    Java求解二叉樹的最近公共祖先實例代碼

    樹是一種非線性的數據結構,它是由n(n>=0)個有限結點組成一個具有層次關系的集合,這篇文章主要給大家介紹了關于Java求解二叉樹的最近公共祖先的相關資料,需要的朋友可以參考下
    2021-06-06
  • SpringBoot?實現微信推送模板的示例代碼

    SpringBoot?實現微信推送模板的示例代碼

    這篇文章主要介紹了SpringBoot?實現微信推送模板,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • 詳解Java繼承中屬性、方法和對象的關系

    詳解Java繼承中屬性、方法和對象的關系

    這篇文章主要幫助大家詳細介紹了Java繼承中屬性、方法和對象的關系,感興趣的朋友可以參考一下
    2016-03-03
  • 使用dom4j解析xml文件,并轉出json格式問題

    使用dom4j解析xml文件,并轉出json格式問題

    這篇文章主要介紹了使用dom4j解析xml文件,并轉出json格式問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java實現將每日新聞添加到自己博客中

    Java實現將每日新聞添加到自己博客中

    這篇文章主要為大家詳細介紹了Java如何實現將每日新聞添加到自己博客中并發(fā)送到微信群中,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2022-12-12

最新評論