由于在dao用的是:session 而不是 hibernateTemplate
先说一下HibernateTemplate与session的区别
使用方法没有多大的区别
我们使用HibernateTemplate,有一个很重要的原因就在于我们不想直接控制事务,不想直接去获取,打开Session,开始一个事务,处理异常,提交一个事务,最后关闭一个SessionHibernateTemplate
所以session中没有事务()
这就需要自己手工的配置事务,事务是配置在service层
所以在配置文件appluicationContext中:
声明采用注解的方式声明事务!
由于写了一个baseServiceImpl的基类
所以各个service都继承与baseServiceImpl
在baseServiceImpl中
@Transactional
public class BaseServiceImpl<T ,E extends IBaseDao<T>> implements IBaseService<T, E> {
在EmployeeServiceImpl中
@Service
public class EmployeeServiceImpl extends BaseServiceImpl<Employee, IEmployeeDao> implements IEmployeeService {
由此可见只在baseServiceImp有l@Transactional
(案例说
这是为什么?
因为 :annotation是可以继承的,所以必须而且一定要在基类中添加@Transactional
倘若只在service中添加@Transactional
而基类中不添加
(即
public class BaseServiceImpl<T ,E extends IBaseDao<T>> implements IBaseService<T, E> {
在EmployeeServiceImpl中
@Service
@Transactional
public class EmployeeServiceImpl extends BaseServiceImpl<Employee, 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
所以会出现异常!!!