精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-01-03
由于一些功能模块用到的Service和DAO层的方法类似,现将类似的方法进行重构,提出基本的Service和DAO,真正用到的Service和DAO只要实现或者继承即可。在重构后遇到事务配置问题,具体如下。
抛出异常:
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 { }
public class TypeService extends BaseService<Type> implements ITypeService { public TypeService(IRBaseDao<Type> typeDAO, boolean isSwitchCharsetTranslate) throws Exception { super(typeDAO, isSwitchCharsetTranslate); } } 我现在就是想在TypeService类中实现字符集的转换,需要重写add等三个方法,当重写后,运行就报开始给出的异常。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间:2008-01-09
谢谢 xly_971223 !
问题解决了。 |
|
返回顶楼 | |
发表时间: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; } } |
|
返回顶楼 | |
浏览 3788 次