您的位置:首页 > 编程语言 > Java开发

使用SpringMVC+Hibernate时出现CglibAopProxy异常

2016-05-09 17:21 447 查看
公共Dao类

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这种写法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: