`
aumy2008
  • 浏览: 118919 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Spring2.0事务配置问题(重写父类方法后出错)

阅读更多

由于一些功能模块用到的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等三个方法,当重写后,运行就报开始给出的异常。
分享到:
评论
3 楼 aumy2008 2008-01-09  
用@Transactional(propagation = Propagation.SUPPORTS)
@Transactional(propagation = Propagation.REQUIRED)开启了子类的事务,具体代码如下:
@Transactional(propagation = Propagation.SUPPORTS)
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;
}
        
         @Transactional(propagation = Propagation.REQUIRED)
public void addOrModify(Type t) {
typeDAO.saveOrUpdate(toDBValue(t));
}

         @Transactional(propagation = Propagation.REQUIRED)
public Long add(Type t) {
return (Long) typeDAO.save(toDBValue(t));
}

         @Transactional(propagation = Propagation.REQUIRED)
public void modify(Type t) {
typeDAO.update(toDBValue(t));
}

private Type toDBValue(Type type) {
......
return type;
}

}
2 楼 aumy2008 2008-01-09  
谢谢 xly_971223 !
问题解决了。
1 楼 xly_971223 2008-01-04  
name 写道
  1. <aop:config> 
   2.     <aop:advisor 
   3.         pointcut="execution(* aumy2008.service.impl..*.*(..)) " 
   4.         advice-ref="txAdviceRet" /> 
   5. </aop:config> 
   6.  
   7. <tx:advice id="txAdviceRet" 
   8.     transaction-manager="transactionManager"> 
   9.     <tx:attributes> 
  10.         <tx:method name="get*" read-only="true" 
  11.             propagation="REQUIRED" /> 
  12.         <tx:method name="load*" read-only="true" 
  13.             propagation="REQUIRED" /> 
  14.         <tx:method name="find*" read-only="true" 
  15.             propagation="REQUIRED" /> 
  16.         <tx:method name="*" propagation="REQUIRED" /> 
  17.     </tx:attributes> 
  18. </tx:advice> 

改成传统事务配置试试
org.springframework.transaction.interceptor.TransactionProxyFactoryBean

相关推荐

    Spring2.0 事务处理

    这篇博客将深入探讨Spring 2.0中的事务处理机制,以及如何通过`applicationContext.xml`配置文件来设置和管理事务。 首先,让我们理解什么是事务。事务是一组数据库操作,这些操作被视为一个单一的工作单元,要么...

    Spring2.0的配置

    本文将详细介绍Spring 2.0的声明式事务配置以及如何简化这一过程。 首先,Spring提供了多种事务管理器,以适应不同的持久层技术和环境。对于单一资源,可以选择如DataSourceTransactionManager(适用于JDBC)、...

    Spring2.0宝典源代码

    《Spring2.0宝典源代码》是一份珍贵的学习资源,由知名作者李刚编写,旨在深入解析Spring框架的2.0版本。这份源代码集合是配合书籍《Spring2.0宝典》使用的,读者可以通过实际操作代码来理解和掌握Spring 2.0的核心...

    SPRING2.0中文文档

    总结,这份中文版的Spring 2.0技术文档全面覆盖了Spring框架的主要特性和使用方法,是开发者深入学习和掌握Spring 2.0不可或缺的工具。通过阅读和实践文档中的示例,开发者可以更好地理解如何利用Spring 2.0解决实际...

    spring2.0中文手册及使用指南 chm

    本手册和使用指南提供了全面的Spring 2.0相关知识,包括其核心特性、配置方式以及如何在实际项目中应用。 首先,让我们深入了解一下Spring框架的核心概念。Spring的依赖注入(Dependency Injection,简称DI)是一种...

    Spring2.0中文教程

    Spring 2.0是Spring框架的一个重要版本,它在Java企业级应用开发中扮演着核心角色。本教程将深入探讨...文档`spring2.0-reference_final_zh_cn.chm`将详细阐述这些概念和技术,帮助你成为一名熟练的Spring开发者。

    spring2.0 中文教程

    2. **AOP(面向切面编程)**:Spring 2.0提供了更强大的面向切面编程支持,使得开发者可以将关注点分离,如日志、事务管理等,从而降低代码复杂性。AOP代理包括JDK动态代理和CGLIB代理,允许开发者定义切入点和通知...

    spring2.0 jar包

    2. **AOP(Aspect-Oriented Programming,面向切面编程)增强**:Spring 2.0增强了对AOP的支持,允许开发者定义和实现切面,从而更好地分离关注点,比如事务管理、日志记录等,可以独立于业务逻辑进行处理。...

    Spring 2.0 spring 2.0 标准API

    Spring 2.0 标准API 用处不大的资源我不发

    详尽的Spring2.0学习提纲

    2. 事务管理:讲解Spring的事务传播行为,配置事务管理器,以及基于注解的事务控制。 六、Spring整合其他技术 1. Spring与MyBatis集成:了解如何将Spring与MyBatis结合,实现DAO层的灵活操作。 2. Spring与...

    Spring 2.0 源代码

    Spring 2.0 是Spring框架的一个重要版本,它在Java企业级应用开发中扮演着核心角色。这个版本引入了许多新特性,增强了框架的功能和灵活性。本文将深入探讨Spring 2.0源代码中的关键知识点,帮助开发者理解其内部...

    SPRING2.0开发详解

    ### SPRING2.0开发详解 #### 一、Spring框架简介 Spring框架是一个开源的Java平台,用于构建企业级应用程序和服务。它最初由Rod Johnson在2004年创建,并随着时间的发展不断壮大和完善。Spring 2.0版本是Spring...

    spring2.0中文参考手册.rar

    5. **支持JSR-250规范**:Spring 2.0 开始支持 JSR-250 规范,引入了如 @PostConstruct 和 @PreDestroy 等注解,用于标记初始化和销毁方法,增强了组件生命周期的管理。 6. **国际化和本地化支持**:Spring 2.0 ...

    spring2.0技术手册_源代码(全十章)

    在这个压缩包中,包含了该手册涉及的全部十章节的源码,这为我们深入研究Spring 2.0的核心特性、配置以及编程模式提供了宝贵材料。 首先,Spring 2.0是一个重要的版本升级,引入了许多新特性和改进,旨在提高开发...

    spring2.0学习源码

    《Spring 2.0 学习源码》是开发者们深入理解Spring框架核心机制的重要参考资料。这个压缩包包含了Spring 2.0版本的源代码,为程序员提供了宝贵的探索与学习平台。Spring作为Java领域的主流框架,其2.0版本是一个重要...

    spring2.0技术手册.pdf

    4. **更好的 XML 配置支持**:Spring 2.0 提供了更强大、更灵活的 XML 配置选项,使得配置更加简洁。 5. **支持更多的 J2EE 技术**:除了传统的 J2EE 技术之外,Spring 2.0 还增加了对 EJB 3.0、JSF 等新标准的支持...

    SPRING2.0---SPRING2.0 說明1

    在"配置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 中文参考手册Spring 2.0 中文参考手册,

Global site tag (gtag.js) - Google Analytics