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条)

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器