首先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; }