applicationContext.xml代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd

"> <bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="com.mysql.jdbc.Driver">
</property>
<property name="username"
value="xufeng">
</property>
<property name="password"
value="123456">
</property>
<property name="url" value="jdbc:mysql://localhost:3306/test"></property>
</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.MySQLDialect
</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>comm/data/Admin.hbm.xml</value>
<value>comm/data/TestTable.hbm.xml</value>
<value>comm/data/Books.hbm.xml</value>
<value>comm/data/Sales.hbm.xml</value></list>
</property>
</bean> <bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<aop:config>
<aop:pointcut id="serviceMethod"
expression="execution(* comm.data..*.*(..))" />
<aop:advisor pointcut-ref="serviceMethod" advice-ref="txAdvice" />
</aop:config>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
 <tx:method name="save*" propagation="REQUIRED"/>
            <tx:method name="add*" propagation="REQUIRED"/>
            <tx:method name="del*" propagation="REQUIRED"/>
          
            <tx:method name="*" read-only="true" rollback-for="exception"/>
  
</tx:attributes>
</tx:advice>
<bean id="AdminDAO" class="comm.data.AdminDAO">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<bean id="TestTableDAO" class="comm.data.TestTableDAO">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<bean id="BooksDAO" class="comm.data.BooksDAO">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<bean id="SalesDAO" class="comm.data.SalesDAO">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>

</beans>测试代码如下:
package test;import java.util.Date;
import java.util.List;import org.hibernate.Session;import comm.data.Admin;
import comm.data.AdminDAO;
import comm.data.TestTable;
import comm.data.TestTableDAO;import comm.factory.DmsSession;
import comm.factory.SpringFactory;import junit.framework.TestCase;import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;public class TestSearch extends TestCase {
    public void testSer(){
     Session session=new DmsSession().getSession();
     AdminDAO ad=(AdminDAO)SpringFactory.getInstance().getBean("AdminDAO");
     List list=ad.findAll();
    
     session.close();
     assert(list.size()>0);
     System.out.println("222");
    }
    @Transactional
    public void testUpdate(){
     Session session=new DmsSession().getSession();
     Admin adm=new Admin();
     TestTable  ttbean=new TestTable();
     adm.setLoginName("3222");//其余两值置空,使其报错测试事务控制能否回滚
     ttbean.setName("ss3asdf");
     ttbean.setCode((long)2134);
     ttbean.setCreateDate(new Date());
     AdminDAO ad=(AdminDAO)SpringFactory.getInstance().getBean("AdminDAO");
     TestTableDAO tt=(TestTableDAO)SpringFactory.getInstance().getBean("TestTableDAO");
    
    
     tt.save(ttbean);
     ad.save(adm);
    
       
     session.close();
    
     System.out.println("222");
    }
}
结果报这个错:
java.lang.ClassCastException: $Proxy4 cannot be cast to comm.data.AdminDAO
at test.TestSearch.testUpdate(TestSearch.java:38)
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 junit.framework.TestCase.runTest(TestCase.java:164)
at junit.framework.TestCase.runBare(TestCase.java:130)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:120)
at junit.framework.TestSuite.runTest(TestSuite.java:230)
at junit.framework.TestSuite.run(TestSuite.java:225)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)去掉<aop:config>
<aop:pointcut id="serviceMethod"
expression="execution(* comm.data..*.*(..))" />
<aop:advisor pointcut-ref="serviceMethod" advice-ref="txAdvice" />
</aop:config>这块代码没问题能执行。但是事务却无法控制执行了。
非常郁闷各位大大看看怎么回事!

解决方案 »

  1.   

    java.lang.ClassCastException: $Proxy4 cannot be cast to comm.data.AdminDAO
    at test.TestSearch.testUpdate(TestSearch.java:38)代码强制转换错误咯...
      

  2.   

    事务回滚失败test表还是插进去了
      

  3.   

    AdminDAO ad=(AdminDAO)SpringFactory.getInstance().getBean("AdminDAO");
    38行有问题,类强制转换的原因,查看下你的类AdminDAO 
      

  4.   

    AdminDAO可能有字段个数没有写全或GET SET方法没生成全吧 检查下
      

  5.   

    哦!那个问题没了。换成接口就没事儿了。但是有个问题我想问。spring事务管理无法对多表操作进行管理吗?比如我有两个表admin和忒 test表一个表我让他正常插入。另一个表制造一个异常。放在同一个事务里。结果正常的表依然能插入进去。事务是只能管理一个表的操作还是?
      

  6.   

    感觉还是spring事务和hibernate结合问题造成的,还是好好看看怎么结合,好像提示有代理类,但是你配置又没有用代理,看来是配置问题
      

  7.   

    <bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
    <tx:annotation-driven transaction-manager="transactionManager"/>
    <aop:config>
    <aop:pointcut id="serviceMethod"
    expression="execution(* comm.data.*.*(..))" />
    <aop:advisor pointcut-ref="serviceMethod" advice-ref="txAdvice" />
    </aop:config>
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
     <tx:method name="save*" propagation="REQUIRED" />
                <tx:method name="add*" propagation="REQUIRED" />
                <tx:method name="del*" propagation="REQUIRED" />
              
                <tx:method name="*" read-only="true" />
      
    </tx:attributes>
    </tx:advice>
      

  8.   

    去掉<aop:config>
     <aop:pointcut id="serviceMethod"
     expression="execution(* comm.data..*.*(..))" />
     <aop:advisor pointcut-ref="serviceMethod" advice-ref="txAdvice" />
     </aop:config>这块代码没问题能执行,能打印出sql语句,但是数据库中没有变化,然后加上就会出现错误
    java.lang.ClassCastException: $Proxy4 cannot be cast to com.cong.manager.UserDaoImpl
    at userDaoImplTest.UserDaoImplTest.test(UserDaoImplTest.java:19)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke
    求解