当前位置: 代码网 > it编程>编程语言>Java > Spring JPA事务管理与自定义操作实例解析(最新推荐)

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

2024年12月25日 Java 我要评论
在spring框架中,数据持久化操作常常与事务管理紧密相关。本文将深入探讨spring data jpa中的事务管理机制,并结合具体实例,展示如何自定义事务行为以满足不同的业务需求。spring jp

在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事务管理内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com