使用SpringMVC+Hibernate时出现CglibAopProxy异常
2016-05-09 17:21
447 查看
公共Dao类
出现这样的异常是因为在Service类声明了@Transactional ,同时又使用context:component-scan来扫描Service所在的包。
参考文章:http://bbs.csdn.net/topics/370099400?page=4
解决方案
删除Service类的@Transactional注解,在spring-hibernate.xml配置文件中手动配置事务通知
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.orm.hibernate5.HibernateTemplate; import org.springframework.stereotype.Repository; @Repository public class BaseDao<T> { @Autowired private HibernateTemplate hibernateTemplate; public HibernateTemplate getHibernateTemplate() { return hibernateTemplate; } public void setHibernateTemplate(HibernateTemplate hibernateTemplate) { this.hibernateTemplate = hibernateTemplate; } public void addEntity(T t){ hibernateTemplate.save(t); } public void updateEntity(T t){ hibernateTemplate.saveOrUpdate(t); } public Object findEntity(T t,Integer id){ return hibernateTemplate.get(t.getClass(),id); } }UserDao类,继承公共DAO类
import org.springframework.stereotype.Repository; import com.lcg.entity.User; import com.lcg.orm.hibernate.base.BaseDao; @Repository public class UserDao extends BaseDao<User>{ @Override public void addEntity(User t) { // TODO Auto-generated method stub super.addEntity(t); } @Override public void updateEntity(User t) { // TODO Auto-generated method stub super.updateEntity(t); } @Override public Object findEntity(User t, Integer id) { // TODO Auto-generated method stub return super.findEntity(t, id); } }Service层
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.lcg.entity.User; import com.lcg.orm.hibernate.dao.UserDao; @Service("userService") @Transactional(readOnly=false) public class UserService { @Autowired private UserDao userDao; public void addEntity(User user) { userDao.addEntity(user); } }spring-hibernate.xml 配置文件
<context:component-scan base-package="com.lcg.orm.hibernate.*"/> <bean name="txManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <!-- 用于Mybatis 的事务配置 <property name="dataSource" ref="druidDataSource" /> --> <property name="sessionFactory" ref="sessionFactory"/> </bean> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate"> <!-- 配置hibernateTemplate,用于增改以及一般的查询 --> <property name="sessionFactory" ref="sessionFactory"/> </bean>项目启动后,虽然能正常运行,但查看控制台信息,可以看到有以下的异常抛出
[org.springframework.aop.framework.CglibAopProxy]Unable to apply any optimisations to advised method: public void com.lcg.orm.hibernate.service.UserService.addUser(com.lcg.entity.User) [org.springframework.aop.framework.CglibAopProxy]Found finalize() method - using NO_OVERRIDE [org.springframework.aop.framework.CglibAopProxy]Found 'equals' method: public boolean java.lang.Object.equals(java.lang.Object) [org.springframework.aop.framework.CglibAopProxy]Unable to apply any optimisations to advised method: public java.lang.String java.lang.Object.toString() [org.springframework.aop.framework.CglibAopProxy]Found 'hashCode' method: public native int java.lang.Object.hashCode() [org.springframework.aop.framework.CglibAopProxy]Unable to apply any optimisations to advised method: protected native java.lang.Object java.lang.Object.clone() throws java.lang.CloneNotSupportedException [org.springframework.aop.framework.CglibAopProxy]Method is declared on Advised interface: public abstract int org.springframework.aop.framework.Advised.indexOf(org.springframework.aop.Advisor) [org.springframework.aop.framework.CglibAopProxy]Method is declared on Advised interface: public abstract int org.springframework.aop.framework.Advised.indexOf(org.aopalliance.aop.Advice) [org.springframework.aop.framework.CglibAopProxy]Method is declared on Advised interface: public abstract boolean org.springframework.aop.framework.Advised.isFrozen() [org.springframework.aop.framework.CglibAopProxy]Method is declared on Advised interface: public abstract void org.springframework.aop.framework.Advised.addAdvice(org.aopalliance.aop.Advice) throws org.springframework.aop.framework.AopConfigException [org.springframework.aop.framework.CglibAopProxy]Method is declared on Advised interface: public abstract void org.springframework.aop.framework.Advised.addAdvice(int,org.aopalliance.aop.Advice) throws org.springframework.aop.framework.AopConfigException [org.springframework.aop.framework.CglibAopProxy]Method is declared on Advised interface: public abstract boolean org.springframework.aop.framework.Advised.isPreFiltered() [org.springframework.aop.framework.CglibAopProxy]Method is declared on Advised interface: public abstract org.springframework.aop.Advisor[] org.springframework.aop.framework.Advised.getAdvisors() [org.springframework.aop.framework.CglibAopProxy]Method is declared on Advised interface: public abstract void org.springframework.aop.framework.Advised.removeAdvisor(int) throws org.springframework.aop.framework.AopConfigException [org.springframework.aop.framework.CglibAopProxy]Method is declared on Advised interface: public abstract boolean org.springframework.aop.framework.Advised.removeAdvisor(org.springframework.aop.Advisor) [org.springframework.aop.framework.CglibAopProxy]Method is declared on Advised interface: public abstract boolean org.springframework.aop.framework.Advised.removeAdvice(org.aopalliance.aop.Advice) [org.springframework.aop.framework.CglibAopProxy]Method is declared on Advised interface: public abstract java.lang.Class[] org.springframework.aop.framework.Advised.getProxiedInterfaces() [org.springframework.aop.framework.CglibAopProxy]Method is declared on Advised interface: public abstract boolean org.springframework.aop.framework.Advised.isInterfaceProxied(java.lang.Class) [org.springframework.aop.framework.CglibAopProxy]Method is declared on Advised interface: public abstract boolean org.springframework.aop.framework.Advised.replaceAdvisor(org.springframework.aop.Advisor,org.springframework.aop.Advisor) throws org.springframework.aop.framework.AopConfigException [org.springframework.aop.framework.CglibAopProxy]Method is declared on Advised interface: public abstract java.lang.String org.springframework.aop.framework.Advised.toProxyConfigString() [org.springframework.aop.framework.CglibAopProxy]Method is declared on Advised interface: public abstract void org.springframework.aop.framework.Advised.setTargetSource(org.springframework.aop.TargetSource) [org.springframework.aop.framework.CglibAopProxy]Method is declared on Advised interface: public abstract org.springframework.aop.TargetSource org.springframework.aop.framework.Advised.getTargetSource() [org.springframework.aop.framework.CglibAopProxy]Method is declared on Advised interface: public abstract boolean org.springframework.aop.framework.Advised.isProxyTargetClass() [org.springframework.aop.framework.CglibAopProxy]Method is declared on Advised interface: public abstract void org.springframework.aop.framework.Advised.setPreFiltered(boolean) [org.springframework.aop.framework.CglibAopProxy]Method is declared on Advised interface: public abstract void org.springframework.aop.framework.Advised.setExposeProxy(boolean) [org.springframework.aop.framework.CglibAopProxy]Method is declared on Advised interface: public abstract void org.springframework.aop.framework.Advised.addAdvisor(org.springframework.aop.Advisor) throws org.springframework.aop.framework.AopConfigException [org.springframework.aop.framework.CglibAopProxy]Method is declared on Advised interface: public abstract void org.springframework.aop.framework.Advised.addAdvisor(int,org.springframework.aop.Advisor) throws org.springframework.aop.framework.AopConfigException [org.springframework.aop.framework.CglibAopProxy]Method is declared on Advised interface: public abstract boolean org.springframework.aop.framework.Advised.isExposeProxy() [org.springframework.aop.framework.CglibAopProxy]Method is declared on Advised interface: public abstract java.lang.Class org.springframework.aop.TargetClassAware.getTargetClass()
出现这样的异常是因为在Service类声明了@Transactional ,同时又使用context:component-scan来扫描Service所在的包。
参考文章:http://bbs.csdn.net/topics/370099400?page=4
解决方案
删除Service类的@Transactional注解,在spring-hibernate.xml配置文件中手动配置事务通知
<tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="get*" read-only="true"/> <tx:method name="is*" read-only="true"/> <tx:method name="find*" read-only="true"/> <tx:method name="select*" read-only="true"/> <tx:method name="*" propagation="REQUIRED" timeout="36000" rollback-for="java.lang.Exception" /> </tx:attributes> </tx:advice>事务管理器通知可以实现“get*,is*,find*,select*”的方法(执行查询语句)不开启事务,“*”的方法开启事务,从而替代了@Transactional这种写法
相关文章推荐
- gen目录无法更新,或者gen目录下的R.JAVA文件无法生成
- Java并发(三) ThreadLocal关键字
- Java Hibernate模板 学习总结
- mac下配置JDK,SDK,NDK和ADB环境变量
- 关于java类的加载与初始化
- WebService学习总结(三)——使用JDK开发WebService
- javamail实现用普通QQ邮箱发送邮件
- java基本数据类型、对应的封装类以及字符串之间的相互转换
- Java Singletom 单例模式 常用实现方式
- Spring官网
- java-string
- Java asList方法使用
- eclipse下切换svn用户
- java之多态
- JAVA学习笔记(六)
- Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
- java中struts2实现简单的文件上传与下载
- Eclipse 中 Project'XX'is missing required library:' 路径错误
- Eclipse 启动时Android SDK下devices.xml报错
- Android studio导入Eclipse项目,和一些错误的解决