学习DAO抽取过程中遇到问题, 提取增删改方法, 放置于BaseDao, 由BaseDaoImpl实现类实现时出现错误, 具体操作如下, 在jsp页面上添加客户时,一提交就出现以下错误:
项目DAO结构如下:
具体代码如下:(只写关键部分,其余省略了)
BaseDao
public interface BaseDao<T> {
public void save(T t);
public void update(T t);
public void delete(T t);
}
BaseDaoImpl
public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> {
@Override
public void save(T t) {
this.getHibernateTemplate().save(t);
}
@Override
public void update(T t) {
this.getHibernateTemplate().update(t);
}
@Override
public void delete(T t) {
this.getHibernateTemplate().delete(t);
}
}
CustomerDao
public interface CustomerDao extends BaseDao<Customer>{
//只看增删改,因为其父接口都实现了,查询这里省略
}
CustomerDaoImpl
@Transactional
public class CustomerDaoImpl extends BaseDaoImpl<Customer> implements CustomerDao {
//增删改在其父类都实现了,这里省略查询
}
解决方法:
进过在CSDN上的搜索,发现 事务注解加注的位置不对,应该加在BaseDaoImpl类上面.
我是这样理解的:
在提取Dao之前功能正常是因为, 增删改的具体实现是在CustomerDaoImpl实现类中的this.getHibernateTemplate()引用了SessionFactory的对象执行了增删改的操作,因此在此处加事务是为了过程的完整性.
而提取Dao之后, 具体实现功能由CustomerDaoImpl的父类BaseDaoImpl实现, 而父类没有加事务,因此会报错, 另外发现事务也能继承. 不知道这样理解是否全面.
将CustomerDaoImpl上的事务注解取消.