hibernate 使用注解+注解拦截器实现自动开启、关闭session,开启、提交、回滚事务
项目为springboot项目 ,springboot版本为:2.5.11, hiernate-core5.4.3 版本。spring-xxx 等为5.3.17版本
注意:在spring-xxx4.x版本+ hiernate-core5.x.x版本中,hibernate的配置 true是有效的,如果不主动开启事务,则sesson每次执行会自动提交事务,到了hiernate-core5.x.x 版本。spring-xxx 等为5.x.x版本后true无效,只要执行DML(select除外) ,就必须手动session.beginTransaction();开启、提交事务、否则会以下错误
com.wying.base.exception.DaoException: Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query
虽然这样更严谨,但是很多基础表单,就一条DML语句(select除外),执行失败了就失败了,没啥好回滚的,也是必须要先开启事务执行很是繁琐
项目使用的 hibernate session 执行DML语句,传统方式如下,每次需要手动关闭session, 开启、提交、回滚事务,比较繁琐,session忘记关闭会导致连接池泄露,进而产生系统宕机的风险
/**
* 修改表单数据
* @param omSysConfigDto_Param
* @return
*/
public int updateData(OmSysConfigDto omSysConfigDto_Param) {
Session session = null;
Transaction transaction = null;
try {
session = getSessionFactory().openSession();
transaction = session.beginTransaction();
String sql = "update om_sys_config set CONFIG_NAME=:configName,CONFIG_KEY=:configKey,CONFIG_VALUE=:configValue,MNEMONIC_CODE=:mnemonicCode ," +
" PINYIN_CODE=:pinyinCode, " +
" DISPLAY_ORDER=:displayOrder,MODIFY_USER=:modifyUser,MODIFY_DATE=:modifyDate,REMARK=:remark where TID=:tid";
Query query = getQuery(sql, omSysConfigDto_Param, session);
int i = query.executeUpdate();
transaction.commit();
return i;
} catch (Exception e) {
transaction.rollback();
e.printStackTrace();
throw new DaoException(e.getMessage());
} finally {
if (session != null) {
session.close();
}
}
}
package com.gaom.base.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.a