由于一些功能模块用到的Service和DAO层的方法类似,现将类似的方法进行重构,提出基本的Service和DAO,真正用到的Service和DAO只要实现或者继承即可。在重构后遇到事务配置问题,具体如下。
抛出异常:
org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
at org.springframework.orm.hibernate3.HibernateTemplate.checkWriteOperationAllowed(HibernateTemplate.java:1085)
at org.springframework.orm.hibernate3.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:624)
at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:362)
at org.springframework.orm.hibernate3.HibernateTemplate.save(HibernateTemplate.java:622)
Spring2.0配置:
<aop:config>
<aop:advisor
pointcut="execution(* aumy2008.service.impl..*.*(..)) "
advice-ref="txAdviceRet" />
</aop:config>
<tx:advice id="txAdviceRet"
transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get*" read-only="true"
propagation="REQUIRED" />
<tx:method name="load*" read-only="true"
propagation="REQUIRED" />
<tx:method name="find*" read-only="true"
propagation="REQUIRED" />
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
重构后的基本接口和实现类的部分代码:
public interface IBaseService<T> {
public Long add(T t);
public void modify(T t);
public void addOrModify(T t);
......
}
public class BaseService<T> implements IBaseService<T> {
private IRBaseDao<T> irBaseDao;
private boolean isSwitchCharsetTranslate;
public BaseService(IRBaseDao<T> irBaseDao, boolean isSwitchCharsetTranslate)
throws Exception {
if (irBaseDao == null) {
throw new Exception("irBaseDao may not be null");
}
this.irBaseDao = irBaseDao;
this.isSwitchCharsetTranslate = isSwitchCharsetTranslate;
}
public Long add(T t) {
return (Long) this.irBaseDao.save(t);
}
public void addOrModify(T t) {
this.irBaseDao.saveOrUpdate(t);
}
public void modify(T t) {
this.irBaseDao.update(t);
}
......
}
public interface IRBaseDao<T> {
public Serializable save(Object o);
public void update(Object o);
public void saveOrUpdate(Object o);
......
}
public class RBaseDao<T> extends HibernateDaoSupport implements IRBaseDao<T> {
public Serializable save(Object o) {
Serializable id = getHibernateTemplate().save(o);
this.flush();
return id;
}
public void update(Object o) {
getHibernateTemplate().update(o);
this.flush();
}
public void saveOrUpdate(Object o) {
getHibernateTemplate().saveOrUpdate(o);
this.flush();
}
......
}
具体业务的接口和实现类的部分代码:
public interface ITypeService extends IBaseService<Type> {
}
public class TypeService extends BaseService<Type> implements ITypeService {
private IRBaseDao<Type> typeDAO;
public boolean isSwitchCharsetTranslate;
public TypeService(IRBaseDao<Type> typeDAO, boolean isSwitchCharsetTranslate)
throws Exception {
super(typeDAO, isSwitchCharsetTranslate);
this.typeDAO = typeDAO;
this.isSwitchCharsetTranslate = isSwitchCharsetTranslate;
}
public void addOrModify(Type t) {
typeDAO.saveOrUpdate(toDBValue(t));
}
public Long add(Type t) {
return (Long) typeDAO.save(toDBValue(t));
}
public void modify(Type t) {
typeDAO.update(toDBValue(t));
}
private Type toDBValue(Type type) {
......
return type;
}
}
public interface ITypeDAO extends IBaseDao<Type> {
}
public class TypeDAO extends RBaseDao<Type> implements ITypeDAO {
}
如果TypeService不重写父类的方法,运行正常
代码如:
public class TypeService extends BaseService<Type> implements ITypeService {
public TypeService(IRBaseDao<Type> typeDAO, boolean isSwitchCharsetTranslate)
throws Exception {
super(typeDAO, isSwitchCharsetTranslate);
}
}
我现在就是想在TypeService类中实现字符集的转换,需要重写add等三个方法,当重写后,运行就报开始给出的异常。
分享到:
相关推荐
这篇博客将深入探讨Spring 2.0中的事务处理机制,以及如何通过`applicationContext.xml`配置文件来设置和管理事务。 首先,让我们理解什么是事务。事务是一组数据库操作,这些操作被视为一个单一的工作单元,要么...
本文将详细介绍Spring 2.0的声明式事务配置以及如何简化这一过程。 首先,Spring提供了多种事务管理器,以适应不同的持久层技术和环境。对于单一资源,可以选择如DataSourceTransactionManager(适用于JDBC)、...
《Spring2.0宝典源代码》是一份珍贵的学习资源,由知名作者李刚编写,旨在深入解析Spring框架的2.0版本。这份源代码集合是配合书籍《Spring2.0宝典》使用的,读者可以通过实际操作代码来理解和掌握Spring 2.0的核心...
总结,这份中文版的Spring 2.0技术文档全面覆盖了Spring框架的主要特性和使用方法,是开发者深入学习和掌握Spring 2.0不可或缺的工具。通过阅读和实践文档中的示例,开发者可以更好地理解如何利用Spring 2.0解决实际...
本手册和使用指南提供了全面的Spring 2.0相关知识,包括其核心特性、配置方式以及如何在实际项目中应用。 首先,让我们深入了解一下Spring框架的核心概念。Spring的依赖注入(Dependency Injection,简称DI)是一种...
Spring 2.0是Spring框架的一个重要版本,它在Java企业级应用开发中扮演着核心角色。本教程将深入探讨...文档`spring2.0-reference_final_zh_cn.chm`将详细阐述这些概念和技术,帮助你成为一名熟练的Spring开发者。
2. **AOP(面向切面编程)**:Spring 2.0提供了更强大的面向切面编程支持,使得开发者可以将关注点分离,如日志、事务管理等,从而降低代码复杂性。AOP代理包括JDK动态代理和CGLIB代理,允许开发者定义切入点和通知...
2. **AOP(Aspect-Oriented Programming,面向切面编程)增强**:Spring 2.0增强了对AOP的支持,允许开发者定义和实现切面,从而更好地分离关注点,比如事务管理、日志记录等,可以独立于业务逻辑进行处理。...
Spring 2.0 标准API 用处不大的资源我不发
2. 事务管理:讲解Spring的事务传播行为,配置事务管理器,以及基于注解的事务控制。 六、Spring整合其他技术 1. Spring与MyBatis集成:了解如何将Spring与MyBatis结合,实现DAO层的灵活操作。 2. Spring与...
Spring 2.0 是Spring框架的一个重要版本,它在Java企业级应用开发中扮演着核心角色。这个版本引入了许多新特性,增强了框架的功能和灵活性。本文将深入探讨Spring 2.0源代码中的关键知识点,帮助开发者理解其内部...
### SPRING2.0开发详解 #### 一、Spring框架简介 Spring框架是一个开源的Java平台,用于构建企业级应用程序和服务。它最初由Rod Johnson在2004年创建,并随着时间的发展不断壮大和完善。Spring 2.0版本是Spring...
5. **支持JSR-250规范**:Spring 2.0 开始支持 JSR-250 规范,引入了如 @PostConstruct 和 @PreDestroy 等注解,用于标记初始化和销毁方法,增强了组件生命周期的管理。 6. **国际化和本地化支持**:Spring 2.0 ...
在这个压缩包中,包含了该手册涉及的全部十章节的源码,这为我们深入研究Spring 2.0的核心特性、配置以及编程模式提供了宝贵材料。 首先,Spring 2.0是一个重要的版本升级,引入了许多新特性和改进,旨在提高开发...
《Spring 2.0 学习源码》是开发者们深入理解Spring框架核心机制的重要参考资料。这个压缩包包含了Spring 2.0版本的源代码,为程序员提供了宝贵的探索与学习平台。Spring作为Java领域的主流框架,其2.0版本是一个重要...
4. **更好的 XML 配置支持**:Spring 2.0 提供了更强大、更灵活的 XML 配置选项,使得配置更加简洁。 5. **支持更多的 J2EE 技术**:除了传统的 J2EE 技术之外,Spring 2.0 还增加了对 EJB 3.0、JSF 等新标准的支持...
在"配置SPRING2.0"的文件中,可能包含的是Spring 2.0的应用上下文配置文件,用于定义Bean、数据源、事务管理器等组件的配置。学习如何正确配置这些元素是理解和使用Spring 2.0的关键步骤。配置文件通常使用XML格式,...
Spring 2.0 中文参考手册,Spring 2.0 中文参考手册,Spring 2.0 中文参考手册,Spring 2.0 中文参考手册Spring 2.0 中文参考手册,