我用的是spring+hibernate,我的工程里面可以运行,数据增加、修改、删除、查询都可以运行,但是我事务加进去后好像没有起作用,程序里面有异常了事务也不回滚也一样的提交事务,也不知道是哪里配置有问题。以下是我的spring.xml文件,高手帮我看看,帮我解答以下心中迷惑
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"
value="org.logicalcobwebs.proxool.ProxoolDriver" />
<property name="url" value="proxool.dbname" />
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.Oracle9Dialect
</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.show_sql">false</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>com/test/dao/Departmenttype.hbm.xml</value>
</list>
</property>
</bean> <bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<bean id="departDAO" class="com.test.dao.DepartmenttypeDAO">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean> <bean id="deparmenttypeService"
class="com.test.service.TestServiceImp">
<property name="departdao">
<ref bean="departDAO" />
</property>
</bean> <bean id="transactionBase"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="proxyInterfaces">
<list>
<value>com.test.service.ITestService</value>
</list>
</property>
<property name="target">
<ref bean="deparmenttypeService" />
</property>
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="transactionAttributeSource">
<ref bean="transactionAttributeSource" />
</property>
</bean>
<bean id="transactionAttributeSource"
class="org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource">
<property name="properties">
<props>
<prop key="test*">PROPAGATION_REQUIRED</prop>
</props>
</property>在附上几个类文件
TestServiceImp.java文件public class TestServiceImp implements ITestService {
private IDepartmenttypeDAO departdao;
public void test() throws RuntimeException{
Departmenttype d = null;
d = new Departmenttype("1278042086015", "测试", "0109909212");
departdao.updateDepartmenttype(d);
departdao.deleteDepartmenttypeByIdstr("1278055764453");
    throw new RuntimeException();
//d = new Departmenttype();
// d.setIdstr(System.currentTimeMillis()+"");
// d.setTypename("Super Martins");
// d.setLevelnumber("01010101010101");
//departdao.save(d);
}  
public void setDepartdao(IDepartmenttypeDAO departdao) {
this.departdao = departdao;
}
@SuppressWarnings("unchecked")
public List getDepartmenttype(){
return departdao.departmenttypeShowAll(1, 10);
}  }DepartmenttypeDAO.java文件public class DepartmenttypeDAO extends HibernateDaoSupport implements IDepartmenttypeDAO{
private static final Log log = LogFactory.getLog(DepartmenttypeDAO.class); protected void initDao() {
// do nothing
}
public void save(Departmenttype transientInstance) {
getHibernateTemplate().save(transientInstance);
}
public void updateDepartmenttype(Object instance){
getHibernateTemplate().merge(instance);
//this.getSessionFactory().getCurrentSession().merge(instance);
}
public void deleteDepartmenttypeByIdstr(String idstr) {
Object object=getHibernateTemplate().get(Departmenttype.class,idstr);
if(object!=null)
getHibernateTemplate().delete(object);
}
}

解决方案 »

  1.   

    加上
    <prop key="*">PROPAGATION_REQUIRED</prop>
      

  2.   

    哥们你应该是用的spring的声明式事物,看你的配置建议你采用以下方式配置,我的项目中的事务是这样配置的,你项目的事务配置错误 <!-- Hibernate的事务管理 -->
    <bean id="hibTxManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory">
    <ref local="sessionFactory" />
    </property>
    </bean>
    <tx:advice id="txAdvice" transaction-manager="hibTxManager">
    <tx:attributes>
    <tx:method name="*" read-only="false" />
    </tx:attributes>
    </tx:advice>
    <aop:config>
    <aop:advisor advice-ref="txAdvice"
    pointcut="execution(* com.*.*.*.service.impl.*.*(..))" />
    </aop:config>
      

  3.   

    自己该下
    execution(* com.*.*.*.service.impl.*.*(..))
    改成你项目的业务层,就ok了
      

  4.   


    <bean id="transactionManager"//事务管理器
      class="org.springframework.orm.hibernate3.HibernateTransactionManager">
      <property name="sessionFactory">
       <ref bean="sessionFactory" />
      </property>
     </bean>
    事务传播特性
     <tx:advice id="txAdvice" transaction-manager="transactionManager">
      <tx:attributes>
       <tx:method name="add*" propagation="REQUIRED"/>add开头的方法,配置事务管理
       <tx:method name="delete*" propagation="REQUIRED" />对delete开头的方法,进行事务管理
       <tx:method name="update*" propagation="REQUIRED" />
       <tx:method name="*" read-only="true" />其他方法只读,一般指查询方法。就不需要事务
      </tx:attributes>
     </tx:advice>
     <aop:config>
      <aop:pointcut id="allManagerMethod"
       expression="execution(* com.hoo.service.*.*(..))" />//对com.hoo.service包下的所有类 所以方法 进行过滤(也就是事务管理)
      <aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod" />
     </aop:config> 
      

  5.   


    完全同意,这是spring2.0的规范写法,自己也是那么写的,楼主是1.x的写法,不过有个疑问,楼主好像底层是jdbc,事务为什么用Hibernate管理事务?等待 回答
      

  6.   

    底层是jdbc的话就不用hibernate来配置了。直接可以用spring+jdbc来实现。在spring里配置下就可以了。
    hibernate不能精确的控制sql语句。用jdbc就可以。
      

  7.   

    <prop key="test*">PROPAGATION_REQUIRED</prop>
    这个只是要求处在事物中
    并没有说对事物要作何处理要起到相应的作用
    需要明确指出怎样处理事物所发生的情况
      

  8.   

    我已经在配置文件中加入了这种事务配置方式
    spring.xml文件中加入: <tx:advice id="txAdvice" transaction-manager="transactionManager">
      <tx:attributes>
       <tx:method name="add*" propagation="REQUIRED"/> 
       <tx:method name="delete*" propagation="REQUIRED" /> 
       <tx:method name="update*" propagation="REQUIRED" />
        <tx:method name="test*" propagation="REQUIRED" />
       <tx:method name="*" read-only="true" /> 
      </tx:attributes>
     </tx:advice>
     <aop:config>
      <aop:pointcut id="allManagerMethod"
       expression="execution(* com.da.police.web..*Service.*(..))" />
      <aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod" />
     </aop:config> 之前的datasource配置改成了这种 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
     <property name="driverClassName"><value>oracle.jdbc.driver.OracleDriver</value></property>
        <property name="url"><value>jdbc:oracle:thin:@127.0.0.1:1521:test</value></property>
        <property name="username"><value>XXXX</value></property>
        <property name="password"><value>XXXX</value></property>
        <property name="maxActive"><value>80</value></property>  
        <property name="maxIdle"><value>20</value></property>  
        <property name="maxWait"><value>3000</value></property>      
    </bean>其它的没有变化,但是现在要报错,以下是错误信息:严重: Servlet.service() for servlet action threw exception
    org.hibernate.SessionException: Session is closed
    at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:126)
    at org.hibernate.transaction.JDBCTransaction.rollbackAndResetAutoCommit(JDBCTransaction.java:183)
    at org.hibernate.transaction.JDBCTransaction.rollback(JDBCTransaction.java:162)
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doRollback(HibernateTransactionManager.java:597)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.doRollbackOnCommitException(AbstractPlatformTransactionManager.java:803)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:690)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:632)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:314)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:116)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
    at $Proxy1.getDepartmenttype(Unknown Source)
    at com.da.police.web.test.action.Test.test(Test.java:31)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:270)
    at com.da.police.common.action.BaseAction.execute(BaseAction.java:31)
    at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
    at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
    at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
    at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Thread.java:619)我的代码里面没有对session关闭为何会报session关闭,是不是那个地方还没有配置对或者是要改程序,请高手些指导!