基于hibernate的声明式事务
spring整合hibernate的声明式事务
<-- 配置声明式事务管理器transactionManager -->
<-- spring整合hibernate的transactionManager -->
<bean id="tm" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<-- 事务管理器依赖于会话工厂sessionFactory -->
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<-- 事务管理器控制的具体方法 如果成功更新数据库 否则回滚 -->
<tx:advice id="txAdvice" transaction-manager="tm">
<tx:attributes>
<tx:method name="get*" read-only="true" />
<tx:method name="search*" read-only="true" />
<tx:method name="loginCheck" read-only="true" />
<tx:method name="*" />
</tx:attributes>
</tx:advice>
<aop:config>
<-- 配置一个事务管理器相关的切面指定切入点 -->
<aop:advisor advice-ref="txAdvice" pointcut="execution(* com.bwf.book.service.impl.*.*(..))" />
</aop:config>
采用了声明式事务后如何使用
session会话管理器的获得:sessionFactory调用getCurrentSession()方法返回一个Session对象实例,然后在dao层可以直接进行HQL查询等数据库操作
如此一来,当整个方法中的所有处理都成功的时候才会提交成功,否则就会回滚
比如插入具有相同主键id的用户对象实例user1和user2,我们在service里面插入user1和user2,根据数据库的设计是不能插入的,这个时候两次插入都不会成功,因为事务回滚了