zoukankan      html  css  js  c++  java
  • Spring+Hibernate集成后事务与Session的一些理解。

    Spring的配置文件,在web.xml加载时,就按照类得映射给动态注入了,而且对于其中需要加载的hibernate配置文件,也只加载一次,就把sessionFactory注入给对象中。然后在类中如果需要取得sessionFactory,只需继承HibernateDaoSupport来取得session.不需要在类中写set方法,因为由HibernateDaoSupport中提供。

    以往我们单独使用Hibernate编程式事务,我们都是这样的步骤:

    Session session=HibernateUtils.getSessionFactory().getCurrentSession();

    session.beginTranstraction();//开启事务

    session.save(…..);

    log.add(log);//假设log.add是在另一个类中的操作数据库的方法。其中也要用session来操作。HibernateUtils.getSessionFactory().getCurrentSession().save(…..);

    session.getTranstraction().commit();

    有异常则session.getTranstraction().rollback();

    注意:

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

    创建的session则不会.所以以上的session是一直都是一个session.

    个人认为:(不管你要执行多少条语句,最后一起commit,就是一个事,也就是一个事务。一个线程只存在一个session)

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

    使用getCurrentSession()需要在hibernate.cfg.xml文件中加入如下配置:

    *如果使用的是本地事务(jdbc事务)

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

    * 如果使用的是全局事务(jta事务)

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

    采用Spring之后我们采用采用声明式事务

    1、声明式事务配置

             *配置SessionFactory

             *配置事务管理器

             *事务的传播特性

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

    2、了解事务的几种传播特性

             1.      PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务。如果没有事务则开启

             2.      PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行

             3.      PROPAGATION_MANDATORY: 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。

             4.      PROPAGATION_REQUIRES_NEW: 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。

             5.      PROPAGATION_NOT_SUPPORTED: 总是非事务地执行,并挂起任何存在的事务。

             6.      PROPAGATION_NEVER: 总是非事务地执行,如果存在一个活动事务,则抛出异常

             7.      PROPAGATION_NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务,

                  则按TransactionDefinition.PROPAGATION_REQUIRED属性执行

            举一个例子:required

    public class UserManagerImpl extends HibernateDaoSupport implements UserManager {
        
           private LogManager logManager;
       

           public void addUser(User user) {
                this.getHibernateTemplate().save(user);
                Log log = new Log();
                log.setType("安全日志");
                log.setDetail("xxx进入系统");
                log.setTime(new Date());
                logManager.addLog(log);
          }

    }

    public class LogManagerImpl extends HibernateDaoSupport implements LogManager {

        public void addLog(Log log) {
            this.getHibernateTemplate().save(log);
        }
    }

    在add方法上都配置Required属性,这样在执行addUser时,会开启新事务,然后在方法执行后,再进行事务提交。其中遇到了addlog方法,它发现当前有事务然后就用当前事务,然后当当前事务提交后,他也跟着提交。

    3、Spring事务的隔离级别

             1.      ISOLATION_DEFAULT: 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.

                  另外四个与JDBC的隔离级别相对应

             2.      ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。

                  这种隔离级别会产生脏读,不可重复读和幻像读。

             3.      ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据

             4.      ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。

                  它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。

             5.      ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。

                  除了防止脏读,不可重复读外,还避免了幻像读。

    4、编写业务逻辑方法

             *继承HibernateDaoSupport类,使用HibernateTemplate来持久化,HibernateTemplate是

              Hibernate Session的轻量级封装

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

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

             *关于事务边界的设置,通常设置到业务层,不要添加到Dao上 

  • 相关阅读:
    Get distinct count of rows in the DataSet
    单引号双引号的html转义符
    PETS Public English Test System
    Code 39 basics (39条形码原理)
    Index was outside the bounds of the array ,LocalReport.Render
    Thread was being aborted Errors
    Reportviewer Error: ASP.NET session has expired
    ReportDataSource 值不在预期的范围内
    .NET/FCL 2.0在Serialization方面的增强
    Perl像C一样强大,像awk、sed等脚本描述语言一样方便。
  • 原文地址:https://www.cnblogs.com/lowerCaseK/p/spring_hibernate_struts.html
Copyright © 2011-2022 走看看