Spring+Hibernate+JPA常见小问题
2011年05月17日
这里,列一些使用JPA常见的问题,算是自己的笔记,希望可以帮到你的小忙。
1、jpa包的冲突
2、事务不正常执行
3、Cannot proxy target class because CGLIB2 is not available
1、jpa包的冲突
运行 jpa 程序,却出现:
Caused by: java.lang.NoSuchMethodError: javax.persistence.spi.PersistenceUnitInfo.getValidationMode()Ljavax/persistence/ValidationMode;
这个是由于jar包的冲突了, 因为使用的是新版本的 Hibernate(这里我使用的是 Hibernate 3.6),跟 javaee.jar 里面的jpa接口冲突了
解决办法
使用 tomcat 中带的 servlet-api.jar 替换 javaee.jar
去掉 Java EE 5 Libraries
新建 user libraries 包含 jsf-api.jar jsf-impl.jar jstl-1.2.jar servlet-api.jar
就是将 MyEclipse 里面的 Java EE 5 Libraries 中的 javaee.jar 换成 servlet-api.jar
然后在工程里加入刚刚的user libraries,OK
2、事务不正常执行
在xml中我们这样写:
===============================================================================
===============================================================================
其他都是正常的情况下,使用 jpaTemplate 的 persist 方法,却是没有反应的。
这个是为什么呢, 马上想到的是,事务根本没有启动,没有启动》???
不是已经设置了
@Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class) 了么。
可是,spring的配置中没有 注明 aop ,因为要切入事务,必需要aop的支持,现在我们使用的是 注解 方法实现 声明式事务
现在,只要加入aop的支持便可以了。
在配置文件中加入:
不要忘记导入相应的包:aopalliance-1.0.jar (这是我使用的)。
3、Cannot proxy target class because CGLIB2 is not available
其实之前做 Flex+Spring 时,也碰到了这样的问题,不过那时没有细细去找原因,因为一看就是没有相应的包,直接加入了包。
当执行事务的类没有实现接口时,可能会报错:
Cannot proxy target class because CGLIB2 is not available. Add CGLIB to the class path or specify proxy interfaces
这时,我们加入 cglib-2.2.jar 这个包就可以了,当然,也要加入其依赖的包:asm-3.2.jar
因为 JDK 的动态代理主要是面向接口的,当事务类没有实现任何接口时,就会报出上面的错误,而Cglib主要是针对类的代理。
2011年05月17日
这里,列一些使用JPA常见的问题,算是自己的笔记,希望可以帮到你的小忙。
1、jpa包的冲突
2、事务不正常执行
3、Cannot proxy target class because CGLIB2 is not available
1、jpa包的冲突
运行 jpa 程序,却出现:
Caused by: java.lang.NoSuchMethodError: javax.persistence.spi.PersistenceUnitInfo.getValidationMode()Ljavax/persistence/ValidationMode;
这个是由于jar包的冲突了, 因为使用的是新版本的 Hibernate(这里我使用的是 Hibernate 3.6),跟 javaee.jar 里面的jpa接口冲突了
解决办法
使用 tomcat 中带的 servlet-api.jar 替换 javaee.jar
去掉 Java EE 5 Libraries
新建 user libraries 包含 jsf-api.jar jsf-impl.jar jstl-1.2.jar servlet-api.jar
就是将 MyEclipse 里面的 Java EE 5 Libraries 中的 javaee.jar 换成 servlet-api.jar
然后在工程里加入刚刚的user libraries,OK
2、事务不正常执行
在xml中我们这样写:
===============================================================================
===============================================================================
其他都是正常的情况下,使用 jpaTemplate 的 persist 方法,却是没有反应的。
这个是为什么呢, 马上想到的是,事务根本没有启动,没有启动》???
不是已经设置了
@Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class) 了么。
可是,spring的配置中没有 注明 aop ,因为要切入事务,必需要aop的支持,现在我们使用的是 注解 方法实现 声明式事务
现在,只要加入aop的支持便可以了。
在配置文件中加入:
不要忘记导入相应的包:aopalliance-1.0.jar (这是我使用的)。
3、Cannot proxy target class because CGLIB2 is not available
其实之前做 Flex+Spring 时,也碰到了这样的问题,不过那时没有细细去找原因,因为一看就是没有相应的包,直接加入了包。
当执行事务的类没有实现接口时,可能会报错:
Cannot proxy target class because CGLIB2 is not available. Add CGLIB to the class path or specify proxy interfaces
这时,我们加入 cglib-2.2.jar 这个包就可以了,当然,也要加入其依赖的包:asm-3.2.jar
因为 JDK 的动态代理主要是面向接口的,当事务类没有实现任何接口时,就会报出上面的错误,而Cglib主要是针对类的代理。