您的位置:首页 > 编程语言 > Java开发

Spring中的事务管理,hibernate整合,struts整合(佟刚)

2013-08-16 14:18 447 查看
1.事务的四个关键属性 (ACID) 
    原子性(atomicity)
    一致性(consistency)
    隔离性(isolation)
    持久性 (durability)

编程式事务管理: 将事务管理代码嵌入到业务方法中来控制事务的提交和回滚. 在编程式管理事务时, 必须在每个事务操作中包含额外的事务管理代码.
声明式事务管理: 大多数情况下比编程式事务管理更好用. 它将事务管理代码从业务方法中分离出来, 以声明的方式来实现事务管理. 事务管理作为一种横切关注点, 可以通过 AOP 方法模块化. Spring 通过 Spring AOP 框架支持声明式事务管理.

事务管理是一种横切关注点

2.并发事务所导致的问题 
脏读 : 对于两个事物 T1, T2, T1  读取了已经被 T2 更新但 还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的.(读未提交)
不可重复读 :对于两个事物 T1, T2, T1  读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段, 值就不同了.
幻读 :对于两个事物 T1, T2, T1  从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行. 之后, 如果 T1 再次读取同一个表,
就会多出几行.(读已提交)

3.基于注解的事务管理 
在 XML 文件中需要配置的项目:
    1)配置 JDBC 的事务管理器 
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
        <property name="dataSource" ref="dataSource" /> 
    </bean> 

    2)配置支持基于注解方式的事务管理 
    <tx:annotation-driven transaction-manager="transactionManager" /> 
    
    在 Java 文件中要使用这个注解:
    @Transactional 
    默认情况下只有未检查异常(RuntimeException和Error类型的异常)会导致事务回滚. 而受检查异常不会.
    rollbackFor:  遇到时必须进行回滚
    noRollbackFor: 一组异常类,遇到时必须不回滚

4.基于 XML 的事务管理 
    XML:
    配置 JDBC 的事务管理器
    <bean id="transactionManager" 
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
        <property name="dataSource" ref="dataSource" /> 
    </bean> 

    配置基于 xml 文件的事务
    <tx:advice transaction-manager="transactionManager" id="txAdvice"> 
    配置事务属性
        <tx:attributes> 
            <tx:method name="purchase" propagation="REQUIRES_NEW"/> 
            <tx:method name="*" /> 
        </tx:attributes> 
    </tx:advice> 

    配置事务的使用范围: 切入点, 把切入点和事务属性关联的 advisor
    <aop:config> 
        <aop:pointcut expression="execution(* cn.itcast.spring.transaction.xml.*.*(..))" id="txPointcut"/> 
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut" /> 
    </aop:config> 

5.事务的传播行为: 
    事务的多种传播行为,我们必须要掌握着两种 required, requied_new 传播行为.    
    required: 如果有事务在运行,当前的方法就在这个事务内运行,否则,就启动一个新的事务,并在自己的事务内运行.
    requied_new :当前的方法必须启动新事
务,并在它自己的事务内运行,如果有事务正在运行,应该将它挂起.

6.Hibernate整合 
就是让 spring 管理和创建 SessionFactory.    
Spring 2.0 同时支持 Hibernate 2.x 和 3.x. 但 Spring 2.5 只支持 Hibernate 3.1 或更高版本

    CustomerDaoImpl 类,传统的自己手动的开启事务和关闭事务操作.
        问题:
        1). 因为一个 Dao 方法创建一个新的 Session, 所以无法实现事务
        2). 在每个 Dao 方法中都重复写同样的事务代码
        解决:    
        1).使用 HibernateTemplate 对象, 且使用 spring 的声明式事务.    
        2).使用 HibernateTemplate 对象    
        
    CustomerDaoImpl2 类,解决上面的问题.使用 HibernateTemplate 提供的类.    
        问题:耦合了 Spring 的     HibernateTemplate 类
        解决:在 DAO 中使用 sessionFactory.getCurrentSession() 方法, 然后在 Service 层开启事务.    
        
    CustomerDaoImpl3 类, 解决 CustomerDaoImpl2 的问题.
        开发中要使用这种实现     
    
    hibernate 的配置文件,可以自己配置,也可以交给 spring 配置
        指定 hibernate 的配置文件:
        <property name="configLocation" value="classpath:hibernate.cfg.xml"/>    
        在 spring 中配置:
        最好不要使用这种配置方式,配置文件不清晰,不方便管理.
        <property name="hibernateProperties"> 
            <props> 
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
                <prop key="hibernate.show_sql">true</prop> 
                <prop key="hibernate.hbm2ddl.auto">update</prop> 
            </props> 
        </property> 
        
        <property name="mappingResources"> 
            <list> 
                <value>cn/itcast/spring/hibernate/Customer.hbm.xml</value> 
            </list> 
        </property> 
        
7.Struts整合 
让 spring 管理 struts 的 action
    
    ①WEB.XML: 
        <context-param> 
            <param-name>contextConfigLocation</param-name> 
            <param-value>/WEB-INF/classes/applicationContext*.xml</param-value> 
        </context-param> 
    
        <listener> 
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
        </listener> 
        
    ②struts-config.xml: 
        一种:缺点:占用了 struts 的唯一扩展点
            <action-mappings> 
                <action path="/customer-add"> 
                    <forward name="success" path="/success.jsp" /> 
                </action> 
            </action-mappings> 
    
            <controller> 
                <set-property property="processorClass" 
                    value="org.springframework.web.struts.DelegatingRequestProcessor" /> 
            </controller> 
        二种:
        <action path="/user-add" 
            type="org.springframework.web.struts.DelegatingActionProxy"> 
            <forward name="success" path="/success.jsp"></forward> 
        </action> 
    
    ③将 Action 注入到 IOC 容器中.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息