Read this introduction to talk an idea about spwrap before continue reading this post.
We have talked before about how to use spwrap in spring boot application.
Today we will talk about a new feature just release in version 0.0.18, which is spwrap now can participate in spring transactions.
spwrap itself doesn't allow spanning transaction across DAO method calls. but as part of 0.0.18, it will participate in spring Transactions if spwrap is used inside spring and there's an active transaction.
Suppose we have a spring project with Datasource transaction manager is enabled.
And we have SupplierDAO which is a spwrap DAO defined like this:
public interface SupplierDAO { @StoredProc("insert_new_supplier") void insertSupplier(@Param(VARCHAR) String name); }
And we have a domain object supplier and its spring-data-jpa repository
@Entity public class Supplier { @Id @GeneratedValue(strategy = AUTO) private Long id; @Column(unique = true) private String name; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } // -- repository public interface SupplierRepo extends JpaRepository<Supplier, Long> { }
And here's the service class:
@Service public class SupplierService { private SupplierDAO supplierDAO; private SupplierRepo supplierRepo; public SupplierService(SupplierDAO supplierDAO, SupplierRepo supplierRepo) { this.supplierDAO = supplierDAO; this.supplierRepo = supplierRepo; } @Transactional public void add2Suppliers(){ final String supplierName = "Abdullah"; supplierDAO.insertSupplier(supplierName); // << will rolled-back Supplier s2 = new Supplier(); s2.setName(supplierName); supplierRepo.save(s2); // throws exception } public List<Supplier> listSuppliers(){ return supplierRepo.findAll(); } }
Now because the supplierDAO.insertSupplier(supplierName) insert supplier with name "Abdullah", and supplierRepo.save(s2) insert supplier with the same name, then spring frameowkr will throw DataAccessException subclass and rollback the entire transaction.
Which meaning the stored procedure that is executed as a result of calling supplierDAO.insertSupplier(supplierName) will be rollbacked as well. Again, this is a new feature as part of spwrap 0.0.18.
You can see the full example at github: https://github.com/mhewedy/spwrap-examples/tree/master/spring-boot-transactions-mysql Don't forget, if you like the spwrap library, don't forget to like the project page at github.
No comments:
Post a Comment