目标:把事务管理托管给spring3
出现的问题:hibernate通过sessionFactory.getCurrentSession()获取的session在执行sql时,总是回滚。
问题原因:hibernate4比hibernate3的几点变化,一是hibernate4所有session必须都放入事务中,
二是如果要把事务托管给spring3,需要设置该参数
hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop>
三是事务管理器声明:<bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager" >
最后:依照上面三点进行修改,采用spring注解方式声明事务,
1.在配置文件中加<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
2.在dao使用session的方法前家@Transactional,该注解默认为propagation=Propagation.REQUIRED,即在需要时创建事务。
3.在dao中注入sessionFactory,
4.在dao方法中,获取session:
Session session = sessionFactory.getCurrentSession();
OrgInfoDomain orgInfoDomain = (OrgInfoDomain) session.createQuery("from OrgInfoDomain as orgInfoDomain where orgInfoDomain.orgno = ?").setString(0, orgno).uniqueResult();
直接使用,不需要beginTransaction和commit。