编程式事务和声明式事务

编程式事务和声明式事务

一、编程式事务

 

下面只帖关于事务的两个关键代码:

hibernate.cfg.xml

  

<session-factory>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://127.0.0.1/test</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">root</property>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.hbm2ddl.auto">update</property>
   
    <property name="hibernate.current_session_context_class">thread</property>
   
    <mapping resource="com/bjsxt/usermgr/model/Log.hbm.xml" />
       <mapping resource="com/bjsxt/usermgr/model/User.hbm.xml" />
  </session-factory>

package com.bjsxt.usermgr.manager;
 
import com.bjsxt.usermgr.model.Log;
import com.bjsxt.usermgr.util.HibernateUtils;
 
public class LogManagerImpl implements LogManager {
 
       public void addLog(Log log) {
              HibernateUtils.getSessionFactory().getCurrentSession().save(log);
       }
 
} 

                  

package com.bjsxt.usermgr.manager;
 
import java.util.Date;
 
import org.hibernate.HibernateException;
import org.hibernate.Session;
 
import com.bjsxt.usermgr.model.Log;
import com.bjsxt.usermgr.model.User;
import com.bjsxt.usermgr.util.HibernateUtils;
 
public class UserManagerImpl implements UserManager {
 
                      public void addUser(User user) {
                                   Session session = null;
                                   try {
                                          session = HibernateUtils.getSessionFactory().getCurrentSession();
                                          session.beginTransaction();
                                         
                                          session.save(user);
                                          Log log = new Log();
                                          log.setType("安全日志");
                                          log.setDetail("***进入系统!");
                                          log.setTime(new Date());
                                         
                                          LogManager logManager = new LogManagerImpl();
                                          logManager.addLog(log);
                                         
                                          session.getTransaction().commit();
                                   } catch (HibernateException e) {
                                          e.printStackTrace();
                                         
                                          session.getTransaction().rollback();
                  } //finally {
                                   //     session.close();
                                   //}
 
                      }
 
}


注:1.getCurrentSession()与getSession()的区别

※    采用getCurrentSession()创建的Session会绑定到当前线程中,而采用openSession()创建的session则不会

※    采用getCurrentSession()创建的Session在commit或rollback时会自动关闭,而采用openSession创建的session()必须手动关闭

2.采用getCurrentSession()创建的session需要在hibernate.cfg.xml中加入如下配置:

※采用本地事务:

                         

 <property name="hibernate.current_session_context_class">thread</property>

※    采用jta事务:

<property name="hibernate.current_session_context_class">jta</property>

二、声明式事务

声明式事务配置

     ● 配置SessionFactory

     ● 配置事务管理器

     ● 事务的传播特性

     ● 那些类那些方法使用事务

编写业务逻辑方法

     ● 继承HibernateDaoSupport类,使用HibernateTemplate来持久化,HibernateTemplate类是对Hibernate Session的轻量级封装

     ● 默认情况下运行期异常才会回滚(包括继承了RuntimeException的子类),普通异常是不会回滚的

     ● 编写业务逻辑方法时最好将异常一直往上抛,在表示层(struts)处理

     ● 关于业务边界的设置,通常设置在业务层,不要添加到DAO上。

ApplicationContext.bean.xml   

    

<!-- 配置sessionFactory -->
    <bean id="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
       <property name="configLocation">
           <value>classpath:hibernate.cfg.xml</value>
       </property>
    </bean>   
   
    <!-- 配置事务管理器 -->
    <bean id="transactionManager"class="org.springframework.orm.hibernate3.HibernateTransactionManager">
       <property name="sessionFactory">
           <ref local="sessionFactory"/>
       </property>
    </bean>
   
    <!-- 配置事务特性 -->      
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="add*" propagation="REQUIRED"/>
        <tx:method name="del*" propagation="REQUIRED"/>
        <tx:method name="update*" propagation="REQUIRED"/>
        <tx:method name="deploy*" propagation="REQUIRED"/>
        <tx:method name="submit*" propagation="REQUIRED"/>
        <tx:method name="*" read-only="true"/>
       
    </tx:attributes>
    </tx:advice>
   
    <!-- 配置那些类的方法进行事务管理 -->
    <aop:config>
    <aop:pointcut id="allManagerMethod" expression="execution (* com.bjsxt.usermgr.manager.*.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod"/>
    </aop:config>   
   
</beans>

 

ApplicationContext.common.xml

    

<bean id="logManager" class="com.bjsxt.usermgr.manager.LogManagerImpl">
       <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    <bean id="userManager" class="com.bjsxt.usermgr.manager.UserManagerImpl">
       <property name="sessionFactory" ref="sessionFactory" />
       <property name="logManager" ref="logManager"></property>
    </bean>
</beans>

 

LogManagerImpl.java

package com.bjsxt.usermgr.manager;
 
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
 
import com.bjsxt.usermgr.model.Log;
 
public class LogManagerImpl extends HibernateDaoSupport implements LogManager {
   
    public void addLog(Log log) {
       this.getHibernateTemplate().save(log);
    }
 
}

UserManagerImpl.java

package com.bjsxt.usermgr.manager;
 
import java.util.Date;
 
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
 
import com.bjsxt.usermgr.model.Log;
import com.bjsxt.usermgr.model.User;
 
public class UserManagerImpl extends HibernateDaoSupport implements UserManager {
   
    private LogManager logManager;
 
    public void setLogManager(LogManager logManager) {
       this.logManager = logManager;
    }
 
    public void addUser(User user) {
           this.getHibernateTemplate().save(user);
          
           Log log = new Log();
           log.setType("安全日志");
           log.setDetail("***进入系统!");
           log.setTime(new Date());
           logManager.addLog(log);
    }
 
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring框架提供了两种事务管理方编程事务管理和声明式事务管理。 1. 编程事务管理: 编程事务管理是通过编写代码来管理事务的提交和回滚。在这种方下,开发人员需要手动编写事务的开始、提交和回滚的代码。Spring提供了`TransactionTemplate`和`TransactionDefinition`等类来简化编程事务管理的操作。通过使用`TransactionTemplate`,可以在需要进行事务处理的代码块中对事务进行管理。 2. 声明式事务管理: 声明式事务管理是通过配置的方来管理事务的提交和回滚,而不需要手动编写事务管理的代码。在这种方下,开发人员只需要在需要进行事务处理的方法上使用注解或者XML配置文件来声明事务的属性,Spring框架就会根据配置自动实现事务管理。常见的注解方是使用`@Transactional`注解。 两种事务管理方各有优劣,编程事务管理灵活性较高,适用于复杂的事务场景,但需要开发人员手动编写大量的事务管理代码;声明式事务管理简化了开发工作,通过配置即可实现事务管理,但对于一些复杂的业务场景可能不够灵活。 总的来说,对于大部分应用场景而言,推荐使用声明式事务管理,可以减少重复代码的编写,提高开发效率。而在一些特殊的业务场景下,如需要动态控制事务的提交和回滚,或者需要手动处理一些特殊情况,可以考虑使用编程事务管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值