yangjun8493 2011-08-15 08:54
浏览 238
已采纳

spring关于事务的问题

请教一下,我在整合两个框架的时候,做单元测试的时候,数据都能顺利的插入到数据库,但是用hibernate统计信息的时候,出现如下信息:
Statistics[start time=1311748544875,sessions opened=1,sessions closed=1,transactions=2,successful transactions=1,optimistic lock failures=0,flushes=1,connections obtained=1,statements prepared=4,statements closed=4,second level cache puts=0,second level cache hits=0,second level cache misses=0,entities loaded=0,entities updated=0,entities inserted=4,entities deleted=0,entities fetched=0,collections loaded=0,collections updated=0,collections removed=0,collections recreated=0,collections fetched=0,queries executed to database=0,query cache puts=0,query cache hits=0,query cache misses=0,max query time=0]

transactions=2,successful transactions=1
这里我弄不明白是什么原因。怎么事务的打开有两次,却只成功了一次。我在网上搜索了一下,没有很好的解答,但是在http://www.iteye.com/problems/60481上,这个人的问题和我一样。请大家帮助解答一下。谢谢
我把我的代码发上来请高手帮我看看:
类ServiceImpl :
@Component("service")
@Transactional
public class ServiceImpl implements Service {
@Resource(name="personDAO")
private PersonDAO personDAO;

public void service1() {
personDAO.save(new Person("yangjun"));
personDAO.save(new Person("alex"));
}
}

类PersonDAOImpl :
@Component("personDAO")
@Transactional
public class PersonDAOImpl implements PersonDAO {
@Resource(name = "sessionFactory")
private SessionFactory sessionFactory;

public void save(Person person) {
sessionFactory.getCurrentSession().persist(person);
}
}

单元测试:
@Test
public void testService1(){
try {
service.service1();
} catch (Exception e) {
System.out.println("----------"+e.getMessage());
}
Statistics st=sessionFactory.getStatistics();
System.out.println("----------------hibernate统计信息:"+st);
System.out.println("打开事务次数:"+st.getTransactionCount());
System.out.println("成功事务次数:"+st.getSuccessfulTransactionCount());
}
}

  • 写回答

9条回答 默认 最新

  • s929498110 2011-08-15 11:41
    关注

    Spring集成Hibernate时已经把SessionFactory给替换掉、
    你现在使用的这个SessionFactory已经不是Hibernate自己的了
    不信你可以打印 sessionFactory.getClass();

    这个getCurrentSession()方法也被Spring给替换了,Spring替换的Session操作都需要Transaction、 因为Spring把Session资源都放在事务管理下的ThreadLocal中。

    Spring自己隐式打开的那个事务并不会与数据库有关、 它只与获取ThreadLocal中的Session等资源有关。

    所以你获取到的两个事务
    一个是自己声明的、用于数据库操作的事务,它执行并且成功了
    一个是Spring隐式打开用于获取与线程绑定的Session资源的,它与数据库操作无关

    另外提醒:如果在Spring下使用sessionFactory.getCurrentSession()的话,如果你没有打开事务,会抛出异常的。
    建议使用HibernateTemplate

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(8条)

报告相同问题?

悬赏问题

  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算