SpringMVC+hibernate4事务处理

首先spring-hibernate.xml里配置事务:

<!-- 配置事务管理器 -->
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <!-- 配置事务增强处理Bean,指定事务管理器 -->
    <tx:advice id="transactionAdvice" transaction-manager="transactionManager">
        <!-- 配置详细事务处理语义 -->
        <tx:attributes>
            <tx:method name="insert*" propagation="REQUIRED" />
            <tx:method name="update*" propagation="REQUIRED" />
            <tx:method name="delete*" propagation="REQUIRED" />

            <tx:method name="get*" propagation="SUPPORTS" read-only="true" />
            <tx:method name="find*" propagation="SUPPORTS" read-only="true" />
            <tx:method name="select*" propagation="SUPPORTS" read-only="true" />
            <tx:method name="load*" propagation="SUPPORTS" read-only="true" />

            <!-- 其他采用默认事务方式 -->
            <tx:method name="*" />

        </tx:attributes>
    </tx:advice>

然后,使用的时候要注意,要用注解的方式在Service层配置事务:

@Override
    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
    public String Save(String template_code, String block_code, String prop_code, String rule_code, String tpl,
            String par_prop, String title) {
        // TODO Auto-generated method stu
        return teValidationRuleDao.Save(template_code, block_code, prop_code, rule_code, tpl, par_prop, title);
    }

最后,要注意如果需要事务回滚,一定要在Dao层抛出RuntimeException这个运行时错误,否则不好使!

@Override
    public String Save(String template_code, String block_code, String prop_code, String rule_code, String tpl,
            String par_prop, String title) {
        // TODO Auto-generated method stub
        String json = "{status: 'OK', msg: '保存成功!'}";
        Session session = this.getCurrentSession();
        try {
            TeValidationRule vModel = new TeValidationRule();
            List<Map> tpls = session.createSQLQuery("select * from te_template_sql t where t.sql_id = '"+tpl+"'")
                    .setResultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP).list();
            String muban = tpls.get(0).get("SQL_TEMPLATE").toString();
            String mainSql = "select b.table_name,p.data_field,p.prop_name from te_template a "
                    + "left join te_template_block b on b.template_code = a.template_code "
                    + "left join te_template_property p on p.block_code = b.block_code "
                    + "where a.template_code = '"+template_code+"' and b.block_code = '"+block_code+"' and p.prop_code = '"+prop_code+"'";
            List<Map> mainProp = session.createSQLQuery(mainSql).setResultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP).list();
            String table = mainProp.get(0).get("TABLE_NAME").toString();
            String datafield = mainProp.get(0).get("DATA_FIELD").toString();
            String pname = mainProp.get(0).get("PROP_NAME").toString();
            
            muban = muban.replaceAll("tableName", table);
            muban = muban.replaceAll("dataField", datafield);
            muban = muban.replaceAll("parField", par_prop);
            
            String rid = "";
            if(rule_code!=null && !rule_code.equals("")){
                rid = rule_code;
                vModel.setRuleCode(rule_code);
            }else{
                rid = UUID.randomUUID().toString();
            }
            vModel.setRuleName(title);
            vModel.setRuleType(2);
            vModel.setRuleContent(muban);
            vModel.setErrorMsg(pname+"格式错误!");
            vModel.setRuleCategoryCode("8e267df45a7a4f59b257f5c15cc09bbb");
            vModel.setRuleStatus(1);
            vModel.setCreateUser("admin");
            vModel.setCreateTime(new Date());
            vModel.setUpdateUser("admin");
            vModel.setUpdateTime(new Date());
            
            if(rule_code!=null && !rule_code.equals("")){
                session.update(vModel);
            }else{
                session.save(vModel);
            }
            
            String numSql = "select count(*) nums from te_template_validation_rule "
                    + "where block_code = '"+block_code+"' and prop_code = '"+prop_code+"' and rule_code = '"+rule_code+"'";
            List nums = session.createSQLQuery(numSql)
                    .addScalar("NUMS").list();
            int has = Integer.parseInt(nums.get(0).toString());
            TeTemplateValidationRule teTemplateValidationRule = new TeTemplateValidationRule();
            String tbp = "";

            teTemplateValidationRule.setBlockCode(block_code);
            teTemplateValidationRule.setPropCode(prop_code);
            teTemplateValidationRule.setRuleCode(rid);
            teTemplateValidationRule.setRuleType(2);
            teTemplateValidationRule.setRuleContent(muban);
            teTemplateValidationRule.setErrorMsg(pname+"格式错误!");
            teTemplateValidationRule.setCreateUser("admin");
            teTemplateValidationRule.setCreateTime(new Date());
            teTemplateValidationRule.setUpdateUser("admin");
            teTemplateValidationRule.setUpdateTime(new Date());
            
            if(has == 0){
                tbp = UUID.randomUUID().toString();
                teTemplateValidationRule.setTemplateRuleCode(tbp);
                session.save(teTemplateValidationRule);
            }else{
                String hasTbpSql = "select template_rule_code from te_template_validation_rule where block_code = '"+block_code+"' and prop_code = '"+prop_code+"' and rule_code = '"+rule_code+"'";
                List tbp_code = session.createSQLQuery(hasTbpSql).addScalar("TEMPLATE_RULE_CODE").list();
                tbp = tbp_code.get(0).toString();
                teTemplateValidationRule.setTemplateRuleCode(tbp);
                session.update(teTemplateValidationRule);
            }
            
        } catch (Exception e) {
            // TODO: handle exception
            json = "{status: 'ERROR', msg: '保存失败!'}";
            throw new RuntimeException();
        }
        return json;
    }
原文地址:https://www.cnblogs.com/wpcnblog/p/8205644.html