使用SpringMVC+Hibernate时出现CglibAopProxy异常

来源:互联网 发布:智能网络电表 编辑:程序博客网 时间:2024/06/04 19:40

公共Dao类

import org.springframework.beans.factory.annotation.Autowired;import org.springframework.orm.hibernate5.HibernateTemplate;import org.springframework.stereotype.Repository;@Repositorypublic class BaseDao<T> {@Autowiredprivate 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;@Repositorypublic class UserDao extends BaseDao<User>{@Overridepublic void addEntity(User t) {// TODO Auto-generated method stubsuper.addEntity(t);}@Overridepublic void updateEntity(User t) {// TODO Auto-generated method stubsuper.updateEntity(t);}@Overridepublic Object findEntity(User t, Integer id) {// TODO Auto-generated method stubreturn 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 {@Autowiredprivate 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这种写法


0 0
原创粉丝点击