* spring事务管理
* Spring事务管理高层抽象主要包括3个接口
1)PlatformTransactionManager 事务管理器 ,用于管理事务
2)TransactionDefinition 事务定义信息(隔离、传播、超时、只读)---静态信息
3)TransactionStatus 事务具体运行状态 ----动态信息
* Spring为不同的持久化框架提供了不同的PlatformTransactionManager接口实现
1)org.springframework.jdbc.datasource.DataSourceTransactionManager 使用Spring JDBC或MyBatis 进行持久化数据时使用
2)org.springframework.orm.hibernate3.HibernateTransactionManager 使用Hibernate3.0版本进行持久化数据时使用
* 事务隔离级别(四种)
DEFAULT 使用后端数据库默认的隔离级别(spring中的的选择项)
READ_UNCOMMITED 允许你读取还未提交的改变了的数据。可能导致脏、幻、不可重复读
READ_COMMITTED 允许在并发事务已经提交后读取。可防止脏读,但幻读和 不可重复读仍可发生
REPEATABLE_READ 对相同字段的多次读取是一致的,除非数据被事务本身改变。可防止脏、不可重复读,但幻读仍可能发生。
SERIALIZABLE 完全服从ACID的隔离级别,确保不发生脏、幻、不可重复读。这在所有的隔离级别中是最慢的,它是典型的通过完全锁定在事务中涉及的数据表来完成的。
*事务传播行为(七种)
PROPAGATION_REQUIRED 支持当前事务,如果不存在 就新建一个
PROPAGATION_SUPPORTS 支持当前事务,如果不存在,就不使用事务
PROPAGATION_MANDATORY 支持当前事务,如果不存在,抛出异常
PROPAGATION_REQUIRES_NEW 如果有事务存在,挂起当前事务,创建一个新的事务
PROPAGATION_NOT_SUPPORTED 以非事务方式运行,如果有事务存在,挂起当前事务
PROPAGATION_NEVER 以非事务方式运行,如果有事务存在,抛出异常
PROPAGATION_NESTED 如果当前事务存在,则嵌套事务执行
* Spring 支持两种方式事务管理
1)编程式的事务管理(了解)
2)声明式事务管理
* xml方式
1.导入jar包(beans,core ,context,expression,spring-aop.jar,spring-aspect.jar,weaver.jar,aop联盟)
2.创建Dao和Service
3.在beans.xml中配置事务管理器
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="datsSource"/>
</bean>
4.配置事务通知
<tx:advice id="myAdvice" transaction-manager="txManager">
<!-- 事务属性 -->
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="t*" propagation="REQUIRED"/>
<tx:method name="find*" read-only="true"/>
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice>
5.配置aop切面
<aop:config>
<!-- 切点 -->
<aop:pointcut expression="execution(* com.uujava.tx.auto.xml.*Service.*(..))" id="myPC"/>
<!-- 切面 = 通知 + 切点 -->
<aop:advisor advice-ref="myAdvice" pointcut-ref="myPC"/>
</aop:config>
6.从spring工厂中获取Service的一个代理对象
ApplicationContext ctx = new ClassPathXmlApplicationContext("com/uujava/tx/auto/xml/beans.xml");
AccountService accountService = (AccountService) ctx.getBean("accountService");//获取的为代理对象
accountService.transfer("李四", "张三", 100d);
System.out.println(accountService.getClass().getSimpleName());
* annotation方式
1.导入jar包(beans,core ,context,expression,spring-aop.jar,spring-aspect.jar,weaver.jar,aop联盟)
2.创建Dao和Service
3.在beans.xml中配置事务管理器
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="datsSource"/>
</bean>
4.在beans.xml中配置注解驱动
<tx:annotation-driven transaction-manager="txManager"/>
5.在Service类上加入@Transactional注解
@Transactional
public class AccountService implements IAccountService {
...
}
6.从spring工厂中获取Service的一个代理对象
ApplicationContext ctx = new ClassPathXmlApplicationContext("com/uujava/tx/auto/annotation/beans.xml");
AccountService accountService = (AccountService) ctx.getBean("accountService");//获取的为代理对象
accountService.transfer("李四", "张三", 100d);
System.out.println(accountService.getClass().getSimpleName());
* struts2 + spring3.2
1)创建一个web项目
2)导入jar(struts2,spring)
3)在web.xml中配置struts2的过滤器
<filter>
<filter-name>struts</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4)在类路径下提供struts.xml
5)在类路径下提供beans.xml
6)在web.xml中配置监听器:ContextLoaderListner
7)创建一个Action类
8)在struts.xml中指定Action由spring创建
<constant name="struts.objectFactory" value="spring"></constant>
9)配置Action ,beans.xml
<bean id="userAction" class="com.uujava.action.UserAction"></bean>
10)struts.xml
<action name="userAction_*" class="userAction" method="{1}">
<result name="success">/index.jsp</result>
</action>
* 加入hibernate
1)导入hibernatejar
2)在类路径下提供hibernate.cfg.xml
3)创建一个数据库
create database s2sh default character set utf8;
4)创建实体类和hbm映射文件
5)在beans.xml中配置本地会话工厂bean(LocalSessionFactoryBean),用于整合hibernate和spring
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 通过setter方法注入hibernate核心配置文件 -->
<property name="configLocation" value="classpath:hibernate.cfg.xml"/>
</bean>
6)创建Dao,Service
7)配置事务管理器,通知,切面
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 事务通知 -->
<tx:advice id="s2shAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="find*" read-only="true"/>
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- AOP切面 -->
<aop:config>
<aop:pointcut expression="execution(* com.uujava.service.*.*(..))" id="s2shPC"/>
<aop:advisor advice-ref="s2shAdvice" pointcut-ref="s2shPC"/>
</aop:config>
* 去掉hibernate核心配置文件
<!-- 数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${driverClass}"></property>
<property name="jdbcUrl" value="${jdbcUrl}"></property>
<property name="user" value="${user}"></property>
<property name="password" value="${password}"></property>
<property name="initialPoolSize" value="${initialPoolSize}"></property>
<property name="maxPoolSize" value="${maxPoolSize}"></property>
<property name="minPoolSize" value="${minPoolSize}"></property>
</bean>
<!-- 配置本地会话工厂bean -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- 注入hibernate属性 -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
<!-- 注册hbm映射文件 -->
<property name="mappingDirectoryLocations">
<list>
<value>classpath:com/uujava/domain</value>
</list>
</property>
</bean>
* HibernateTemplte常用API
Serializable save(Object entity)
void update(Object entity)
void delete(Object entity)
<T> T get(Class<T> entityClass, Serializable id)
<T> T load(Class<T> entityClass, Serializable id)
List find(String queryString, Object... values)
List findByCriteria(DetachedCriteria criteria)
List findByNamedQuery(String queryName, Object... values)
* 使用注解整合SSH
1)创建web项目
2)导入jar
3)配置web.xml(struts2的过滤器,spring的监听器,OpenSessionInViewFilter)
4)配置beans.xml(数据源,本地会话工厂bean,事务管理器,组件扫描,支持注解,事务的注解驱动)
5)在Dao,Service,Action类上加入注解
来源:oschina
链接:https://my.oschina.net/u/100492/blog/225212