Spring transaction practice, an error example:
package lin; import lin.dao.impl.ExchangeDaoLocator; import lin.dao.impl.TestDaoLocator; import lin.domain.Exchange; import lin.domain.Test; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.jdbc.core.JdbcTemplate; public class DbTest { public static void main(String[] args) { try { ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("ApplicationContext.xml"); JdbcTemplate jdbcTemplate = (JdbcTemplate) applicationContext.getBean("jdbcTemplate"); jdbcTemplate.execute("select * from dual"); ExchangeDaoLocator locator1 = (ExchangeDaoLocator) applicationContext.getBean("exchangeDaoLocator"); Exchange exchange = locator1.findById("HK"); System.out.println(exchange.getExchangeCode()); TestDaoLocator locator2 = (TestDaoLocator) applicationContext.getBean("testDaoLocator"); Test test = locator2.findById("1"); System.out.println(test.getC2()); System.out.println("----------------End----------------"); } catch (Exception e) { e.printStackTrace(); } } }
<bean id="abstractDaoLocator" class="lin.dao.AbstractDaoLocator" abstract="true"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <bean id="exchangeDaoLocator" class="lin.dao.impl.ExchangeDaoLocator" parent="abstractDaoLocator"> </bean> <bean id="testDaoLocator" class="lin.dao.impl.TestDaoLocator" parent="abstractDaoLocator"> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> <property name="defaultTimeout" value="15"/> <property name="rollbackOnCommitFailure" value="true"/> </bean> <aop:config> <!-- Normal Example --> <aop:advisor pointcut="execution(* lin.DbTest..*(..))" advice-ref="requiresNewTxAdvice" /> <!-- Wrong Example - java.lang.ClassCastException: $Proxy8 incompatible with lin.dao.impl.ExchangeDaoLocator --> <aop:advisor pointcut="execution(* lin.dao.impl.*.findById(..))" advice-ref="requiresNewTxAdvice" /> </aop:config> <tx:advice id="requiresNewTxAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="*" propagation="REQUIRES_NEW" /> </tx:attributes> </tx:advice>