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

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 容器中.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值