wuwei35531 2013-02-23 23:54
浏览 236
已采纳

spring声明式事务,service层必须在ioc容器中声明?

各位,小弟在学习spring+hibernate 声明式事务时,发现一个问题, 做了两种测试

  1. 建立一个普通的 java project
    x.y.services 包下有 applicationContext.xml, DefaultFooService.java, 在applicationContext.xml中对DefaultFooService进行声明式事务,并注入 DefaultFooService
    运行后成功实现事务管理

  2. 建立一个 web dynamic project
    在applicationContext.xml中对DefaultFooService进行声明式事务,但不注入 DefaultFooService,而是在 DefaultFooService.java中,
    [code="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);
    }[/code]

同时在 spring-servlet.xml中
[code="xml"][/code]

这样的话,事务没有成功

所以,请问 问题出在哪?
我个人猜测是不是因为我没有使用 IoC容器管理 DefaultFooService,所以声明式事务无法实现,如果是这样,应该怎样进行事务管理?

谢谢!

  • 写回答

1条回答

  • diaozhanming 2013-02-25 08:47
    关注

    哥们,你这个我看是没有在你的applicationcontext中配置dao,而是在initmethod中直接instant的dao,所以你的这个dao不是由spring容器进行维护的,所以spring对它什么也做不了,自然就无法进行声明式事物控制了。你如果使用annotation注入的dao的话也是一样可以生效的,另外一个小建议就是如果使用@Transactional,最好放在service层。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 docker模式webrtc-streamer 无法播放公网rtsp
  • ¥15 学不会递归,理解不了汉诺塔参数变化
  • ¥15 基于图神经网络的COVID-19药物筛选研究
  • ¥30 软件自定义无线电该怎样使用
  • ¥15 R语言mediation包做中介分析,直接效应和间接效应都很小,为什么?
  • ¥15 Jenkins+k8s部署slave节点offline
  • ¥15 如何实现从tello无人机上获取实时传输的视频流,然后将获取的视频通过yolov5进行检测
  • ¥15 WPF使用Canvas绘制矢量图问题
  • ¥15 用三极管设计一个单管共射放大电路
  • ¥15 孟德尔随机化r语言运行问题