Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session...

学习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上的事务注解取消.

 

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值