hibernate 使用注解+拦截器实现自动开启、关闭session,提交、回滚事务

2023-12-31 23:25:38

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();
            }
        }
    }

使用注解+注解拦截器+ThreadLocal线程变量优化

1、 定义OpenSession注解
package com.gaom.base.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.a

文章来源:https://blog.csdn.net/qq445829096/article/details/135311015
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。