spring-config.xml 内容如下:<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"><beans>
    <!-- 声明数据源, 建议使用apache或Spring自带的数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName">
<value>oracle.jdbc.driver.OracleDriver</value>
</property> <property name="url">
<value>jdbc:oracle:thin:@127.0.0.1:1521:oracledb</value>
</property>

<property name="username">
<value>storm</value>
</property>

<property name="password">
<value>Bfzx1981</value>
</property>
</bean>    <!-- 将Spring于Hibernate进行整合, 整合后Hibernate将使用上面所配置的数据源 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="dataSource" />
</property> <property name="mappingResources"> 
<list> 
<value>com/storm/myssh/persistent/dao/mapping/Student01.hbm.xml</value>
</list> 
</property> 

<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>     <!-- 声明Hibernate事务管理机制 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean> <!-- 声明Spring事务管理机制, 此机制依赖于Hibernate的事务管理-->
<bean id="userDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>

<property name="target">
<ref bean="student01Dao" />
</property>

<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
</beans>
spring-ioc.xml 内容如下:<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"><beans>
<!-- 为了方便管理, 注意声明顺序 Action依赖于Service依赖于Dao -->
<bean name="/student01" class="com.storm.myssh.action.Student01Action">
<property name="student01Service">
<ref bean="student01Service" />
</property>
</bean>

<bean id="student01Service" class="com.storm.myssh.service.impl.Student01ServiceImpl">
<property name="student01Dao">
<ref bean="student01Dao" />
</property>
</bean>

<bean id="student01Dao" class="com.storm.myssh.persistent.dao.impl.Student01DaoImpl">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
</beans>Student01DaoImpl.java 内容如下package com.storm.myssh.persistent.dao.impl;import java.util.List;import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;import com.storm.myssh.common.SqlUtils;
import com.storm.myssh.dto.Student01Dto;
import com.storm.myssh.persistent.dao.Student01Dao;public class Student01DaoImpl extends HibernateDaoSupport implements Student01Dao{

private SessionFactory sessionFactory;

    private static final String[] propertyArray = new String[]{
         "schoolId", "name", "sex", "age", "phone", "address"
};

    public void insert(Student01Dto student01Dto){
     this.getHibernateTemplate().save(student01Dto);
     System.out.println("数据已经插入, 即将测试回滚!");
     throw new RuntimeException();
    }    public void update(Student01Dto student01Dto){
     getHibernateTemplate().update(student01Dto);
    }    public void delete(Student01Dto student01Dto){
     getHibernateTemplate().delete(student01Dto);
    }    public List find(Student01Dto student01Dto){
    
        StringBuffer sql = new StringBuffer(100);
        sql.append("select {t.*} from Student01 t where 1=1 ");        StringBuffer stdsql = new StringBuffer(100);//存储根据对象生成的条件
        stdsql.append(SqlUtils.addConditions(student01Dto, propertyArray));
        
        sql.append(stdsql);
        
        List list = getHibernateTemplate().find(sql.toString());
        return list;
    }
}
Student01Action.java 内容如下:package com.storm.myssh.action;import java.util.List;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;import com.storm.myssh.dto.Student01Dto;
import com.storm.myssh.service.Student01Service;public class Student01Action extends Action {

//在Action中必须定义Service成员及其set方法, 此成员由Spring负责注入.
private Student01Service student01Service;

public void setStudent01Service(Student01Service student01Service) {
this.student01Service = student01Service;
}

private ActionMessages errors = new ActionMessages();



public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {

errors.clear();//解决了再次进入Action时errors不为空的情况, 解决了转向错误.

try{
student01Service.insert((Student01Dto)form);
}catch(Exception e){
e.printStackTrace();
errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("error.insert.failed"));
}

if (!errors.isEmpty()) {
saveErrors(request, errors);
return (new ActionForward(mapping.getInput()));
}

form.reset(mapping, request);//解决提交成功后跳转回此页面时数据残留的问题
return mapping.findForward("success");
}











public ActionForward update(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {   
try{
student01Service.update((Student01Dto)form);
}catch(Exception e){
e.printStackTrace();
errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("error.update.failed"));
} if (!errors.isEmpty()) {
saveErrors(request, errors);
return (new ActionForward(mapping.getInput()));
}
return mapping.findForward("success");
}

public ActionForward delete(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
try{
student01Service.delete((Student01Dto)form);
}catch(Exception e){
e.printStackTrace();
errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("error.delete.failed"));
} if (!errors.isEmpty()) {
saveErrors(request, errors);
return (new ActionForward(mapping.getInput()));
}
return mapping.findForward("success");
}

public ActionForward find(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
try{
List list = student01Service.find((Student01Dto)form);
request.setAttribute("list", list);
}catch(Exception e){
e.printStackTrace();
errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("error.delete.failed"));
}
return mapping.findForward("success");
}
}
哪位高手帮我看看, 为什么抛出异常不能回滚呢?

解决方案 »

  1.   

    配置文件改一下<bean   name="/student01"   class="com.storm.myssh.action.Student01Action"> 
    <property   name="student01Service"> 
    <ref   bean="student01Service"   /> 
    </property> 
    </bean><bean   id="student01Service"   class="com.storm.myssh.service.impl.Student01ServiceImpl"> 
    <property   name="student01Dao"> 
    <ref   bean="userDAOProxy"   /> 
    </property> 
    </bean> <bean   id="userDAOProxy"   class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 
    <property   name="transactionManager"> 
    <ref   bean="transactionManager"   /> 
    </property>
    <property   name="target"> 
    <ref   bean="student01Dao"   /> 
    </property> 
    <property   name="transactionAttributes"> 
    <props> 
    <prop   key="insert*"> PROPAGATION_REQUIRED ,-RuntimeException</prop>
    <prop   key="update*"> PROPAGATION_REQUIRED ,-RuntimeException</prop>
    <prop   key="delete*"> PROPAGATION_REQUIRED ,-RuntimeException</prop>
    <prop   key="find*"> PROPAGATION_REQUIRED,readOnly </prop> 
    </props> 
    </property> 
    </bean> 
      

  2.   

    写的可以啊!用SPRING控制 HIBERNATE
      

  3.   

    自己定义一个MyCheckedException , 自己捕获异常,重现抛出MyCheckedException 
      

  4.   

    就像1楼做法,抛出特定类型的异常时“-”号表示回滚,“+”号表示提交,因为事务由容器来管理,所以一般控制容器行为的地方都在配置文件中,更多细节的控制还可以查询Spring事务控制的语法