Spring JPA事务管理与自定义操作实例解析(最新推荐)

 更新时间:2024年12月24日 12:08:09   作者:t0_54coder  
在Spring框架中,数据持久化操作常常与事务管理紧密相关,本文将深入探讨Spring Data JPA中的事务管理机制,并结合具体实例,展示如何自定义事务行为以满足不同的业务需求,感兴趣的朋友一起看看吧

在Spring框架中,数据持久化操作常常与事务管理紧密相关。本文将深入探讨Spring Data JPA中的事务管理机制,并结合具体实例,展示如何自定义事务行为以满足不同的业务需求。

Spring JPA中的事务管理

在Spring Data JPA中,默认的CrudRepository实现是SimpleJpaRepository。这个类通过@Transactional注解支持事务管理,其中readOnly = true属性意味着默认情况下所有方法都在只读事务中执行。对于写操作,如deleteByIddeleteAll等,它们通过@Transactional注解覆盖了只读行为,使得这些方法在写事务中执行。

@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)); // 这将触发异常
    }
}

在上面的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注解,那么即使触发了唯一性约束异常,前两名员工的数据仍然会被保存,这违背了事务的原子性原则。

通过上述分析,我们可以看到Spring JPA事务管理的灵活性和强大功能,以及如何通过自定义事务行为来满足复杂的业务需求。

到此这篇关于Spring JPA事务管理与自定义操作实例解析的文章就介绍到这了,更多相关Spring JPA事务管理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 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如何实现将每日新闻添加到自己博客中并发送到微信群中,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-12-12

最新评论