问题描述
各位,小弟在学习spring+hibernate 声明式事务时,发现一个问题, 做了两种测试1. 建立一个普通的 java projectx.y.services 包下有 applicationContext.xml, DefaultFooService.java, 在applicationContext.xml中对DefaultFooService进行声明式事务,并注入 DefaultFooService运行后成功实现事务管理2. 建立一个 web dynamic project在applicationContext.xml中对DefaultFooService进行声明式事务,但不注入 DefaultFooService,而是在 DefaultFooService.java中,public void init() {System.out.println("init...");ctx = new ClassPathXmlApplicationContext("applicationContext.xml");sessionFactory = (SessionFactory)ctx.getBean("sessionFactory");if(sessionFactory == null) {System.out.println("sessionFactory is null");}fooDaoHibernate = new FooDaoHibernate();if(fooDaoHibernate == null) {System.out.println("fooDaoHibernate in init() is null");}fooDaoHibernate.setSessionFactory(sessionFactory);relationshipDaoHibernate = new RelationshipDaoHibernate();relationshipDaoHibernate.setSessionFactory(sessionFactory);}同时在 spring-servlet.xml中<bean id="fooService" class="x.y.services.DefaultFooService" init-method="init"></bean>这样的话,事务没有成功所以,请问 问题出在哪?我个人猜测是不是因为我没有使用 IoC容器管理 DefaultFooService,所以声明式事务无法实现,如果是这样,应该怎样进行事务管理?谢谢! 问题补充:补充:public class DefaultFooService implements FooService { private static FooDaoHibernate fooDaoHibernate; private static RelationshipDaoHibernate relationshipDaoHibernate; private static ApplicationContext ctx = null; private static SessionFactory sessionFactory = null; ...}1. 建立一个普通的 java project, 在applicationContext.xml中,注入DefaultFooService,<bean id="fooService" class="x.y.service.DefaultFooService"> <property name="fooDaoHibernate" ref="fooDao" /> <property name="relationshipDaoHibernate" ref="relationshipDao" /></bean><bean id="fooDao" class="x.y.service.FooDaoHibernate"> <property name="sessionFactory" ref="sessionFactory" /></bean><bean id="relationshipDao" class="x.y.service.RelationshipDaoHibernate"> <property name="sessionFactory" ref="sessionFactory" /></bean>,2. 建立一个 web dynamic project,在applicationContext.xml中,没有上面的代码,而是如正文所述。
解决方案
哥们,你这个我看是没有在你的applicationcontext中配置dao,而是在initmethod中直接instant的dao,所以你的这个dao不是由spring容器进行维护的,所以spring对它什么也做不了,自然就无法进行声明式事物控制了。你如果使用annotation注入的dao的话也是一样可以生效的,另外一个小建议就是如果使用@Transactional,最好放在service层。