由于在dao用的是:session 而不是 hibernateTemplate
先说一下HibernateTemplate与session的区别
使用方法没有多大的区别
我们使用HibernateTemplate,有一个很重要的原因就在于我们不想直接控制事务,不想直接去获取,打开Session,开始一个事务,处理异常,提交一个事务,最后关闭一个SessionHibernateTemplate是Hibernate操作进行封装,我们只要简单的条用HibernateTemplate
对象,传入hql和参数,就获得查询接口,至于事务的开启,关闭,都交给HibernateTemplate 对象来处理我们自己只专注于业务,不想去作这些重复而繁琐的操作。我们把这些责任全部委托给了
HibernateTemplate,然后使用声明式的配置来实现这样的功能。如果我们通过类似getSession()这样的方法获得了Session,那就意味着我们放弃了上面所说的一切好处。
所以session中没有事务()
这就需要自己手工的配置事务,事务是配置在service层
所以在配置文件appluicationContext中:
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
ref="sessionFactory">
/
声明采用注解的方式声明事务!
由于写了一个baseServiceImpl的基类
所以各个service都继承与baseServiceImpl
在baseServiceImpl中
@Transactional
public
class BaseServiceImpl
IBaseDao>
implements IBaseService
{
在EmployeeServiceImpl中
@Service
public
class EmployeeServiceImpl extends
BaseServiceImpl
IEmployeeDao> implements IEmployeeService
{
由此可见只在baseServiceImp有l@Transactional
(案例说 在每个service中都应该添加@Transactiona)
这是为什么?
因为 :annotation是可以继承的,所以必须而且一定要在基类中添加@Transactional
倘若只在service中添加@Transactional
而基类中不添加
(即
public
class BaseServiceImpl
IBaseDao>
implements IBaseService
{
在EmployeeServiceImpl中
@Service
@Transactional
public
class EmployeeServiceImpl extends
BaseServiceImpl
IEmployeeDao> implements IEmployeeService
{
)
会有下面的异常
org.hibernate.HibernateException: No Hibernate Session
bound to thread, and configuration does not allow creation of
non-transactional one her
这是因为子类service会调用父类的方法,而父类中的方法并没有@Transactional
所以会出现异常!!!