一、spring 整合aop事务
上篇文章讨论了spring整合hibernate,就是帮助我们管理sessionFactory对象,今天使用spring整合事务的时候会用到sessionFactory来连接。
下面用一个案例来演示spring整合aop事务的使用方式,即保存用户。
1、使用xml配置事务
<1> 在ApplicationContext.xml中配置
<bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="hibernateProperties">
<props>
<prop key="hibernate.connection.driver_class" >com.mysql.jdbc.Driver</prop>
<prop key="hibernate.connection.url" >jdbc:mysql:///xxx?useUnicode=true&characterEncoding=UTF-8</prop>
<prop key="hibernate.connection.username" >root</prop>
<prop key="hibernate.connection.password" >xxx</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
<!-- 引入orm元数据 -->
<property name="mappingDirectoryLocations" value="classpath:com/tz/domain">
</property>
</bean>
<!-- 配置事务管理器 -->
<bean name ="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!--配置通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="toLogin" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
<tx:method name="save*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
</tx:attributes>
</tx:advice>
<!--配置织入-->
<aop:config>
<aop:pointcut expression="execution(* com.tz.service.Impl.*ServiceImpl.*(..))" id="txPc"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPc"/>
</aop:config>
<2> 编写 dao 层
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
@Override
public void save(User user) {
getHibernateTemplate().save(user);
}
}
<3> 编写 service 层
public class UserServiceImpl implements UserService {
@Resource(name="userDao")
private UserDao ud;
@Override
public void saveUser(User u ) {
ud.save(u);
}
<4> 测试类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(“classpath:ApplicationContext.xml”)
public class hibernateTest {
@Resource(name=”userService”)
private UserService us;
@Test
public void testTx(){
User user = new User();
user.setUser_code(“呆呆”);
user.setUser_password(“12346”);
us.saveUser(user);
}
Junit测试后查看数据库表中有了数据。
2、使用注解配置
修改applicationContext.xml配置文件
<!-- 配置事务管理器 -->
<bean name ="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!--
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="toLogin" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
<tx:method name="save*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
</tx:attributes>
</tx:advice>
配置织入
<aop:config>
<aop:pointcut expression="execution(* com.tz.service.Impl.*ServiceImpl.*(..))" id="txPc"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPc"/>
</aop:config>
-->
<!--开启使用注解配置-->
<tx:annotation-driven/>
在service 类中使用注解即可:
//在类中使用注解
@Transactional(isolation=Isolation.REPEATABLE_READ,propagation=Propagation.REQUIRED,readOnly=true)
public class UserServiceImpl implements UserService {
@Resource(name="userDao")
private UserDao ud;
//在方法上使用注解单独配置readOnly=false,标识可以对数据库中的数据进行修改
@Override
@Transactional(isolation=Isolation.REPEATABLE_READ,propagation=Propagation.REQUIRED,readOnly=false)
public void saveUser(User u ) {
ud.save(u);
}
}
同样使用上面的测试类测试就可以。
二、扩大session的作用范围,解决no-session 问题。
思路:之所以会出现这个问题,就是因为 session 的作用范围太小,从一次请求开始到请求结束保证session不断才可以。那么就想到了filter可以实现这种功能所以只需在web.xml中如下配置:
<filter>
<filter-name>session</filter-name>
<filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>session</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这样就可以解决no-session问题了。到此为止,ssh的整合已经结束了,相信大家根据所学的知识,再顺着文章的思路就能完成ssh的整合,为项目实战做准备。