一、集成方式
1、采用Spring的IOC,但是事务还是采用Nutz自己管理控制;
2、采用Spring的声明式事务管理控制;
二、IOC
直接依据数据源注入即可
@Beanpublic NutDao nutz(DataSource dataSource) {return new NutDao (dataSource);;}
此时Nutz Dao的事务并不能通过Spring的事务来管理(如@Transactional注解、手动事务等),还是通过Nutz本身的 Trans.exec(() -> {}) 进行管理
例:
public void testService() {Trans.exec(() -> {dao.insert("test_table", Chain.make("id", 3));throw new RuntimeException("test exception");});}
三、将事务交给Spring管理
step1:继承NutDao类,重写run方法
public class SpringNutDao extends NutDao {public SpringNutDao(DataSource dataSource) {super(dataSource);}@Overridepublic void run(ConnCallback callback) {Connection con = DataSourceUtils.getConnection(getDataSource());try {callback.invoke(con);} catch (Exception e) {if (e instanceof RuntimeException) {throw (RuntimeException) e;} else {throw new RuntimeException(e);}} finally {DataSourceUtils.releaseConnection(con, getDataSource());}}
}
step2:将继承类注入
@Beanpublic NutDao nutz(DataSource dataSource) {return new SpringNutDao(dataSource);}
step3:将数据源事务管理注入
@Beanpublic DataSourceTransactionManager transactionManager(DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}
例1:
@Transactionalpublic void testService() {dao.insert("test_table", Chain.make("id", 3));throw new RuntimeException("test exception");}
例2:
@Autowiredprivate PlatformTransactionManager transactionManager;public void testService() {DefaultTransactionDefinition def = new DefaultTransactionDefinition();TransactionStatus transactionStatus = transactionManager.getTransaction(def);try{dao.insert("test_table", Chain.make("id", 3));throw new RuntimeException("test exception");}catch (Exception e){if (transactionStatus.isCompleted()) {System.out.println("事务已完成,无需回滚");}else {transactionManager.rollback(transactionStatus);}}}
四、XML文件方式
Nutz DAO与spring集成讨论 - 6小贝 - 博客园