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中我们这样写: =============================================================================== <context:annotation-config /> <!-- 数据库的配置 --> <bean id="hibernate_DataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/qsweike?useUnicode=true&characterEncoding=gbk" /> <property name="username" value="root"/> <property name="password" value="19891231"/> <property name="defaultAutoCommit" value="false" /> </bean> <!-- 数据库的配置 结束 --> <!--jpa 配置开始--> <!-- JPA EntityManagerFactoryBean for EntityManager 很明显这个就是实体管理的bean,这里使用的是 lacalContainerEntityManagerFactoryBean,这个提供了最全面的功能 官方文档也是推荐使用这个,我们要相信官方的力量=.= 同时,指定了persistenceXmlLocation,即是持久性相关配置文件,可以理解成 jpa 具体实现的配置文件 比如我们使用hibernate实现jpa的话,那么persistence.xml里面就是hibernate相关的 persistenceUnit 的name 要与persistence.xml文件中的persistenceUint的name一样哦 --> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="persistenceXmlLocation" value="classpath:persistence.xml" /> <property name="persistenceUnitName" value="persistenceUnit" /> <property name="dataSource" ref="hibernate_DataSource" /> </bean> <!-- Transaction manager for JPA 对于jdbc的事务,我们还是交给spring吧 他可以很好地帮我们处理事务回滚等工作 --> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory"> <ref bean="entityManagerFactory" /> </property> </bean> <!--然后我们配置一下jpaTemplate 这个跟hibernateTemplate几乎是差不多的,具有的方法也大同小异 转型也是瞬间的事 因为我还是比较习惯使用 dao 分层,service 对外接口的数据库层访问的结构,所以就加了这个 jpaTemplate 在dao中就可以注入这个jpaTemplate --> <bean id="jpaTemplate" class="org.springframework.orm.jpa.JpaTemplate"> <property name="entityManagerFactory"> <ref bean="entityManagerFactory" /> </property> </bean> <!--jpa 配置结束--> <context:component-scan base-package="cn.weike" /> =============================================================================== 其他都是正常的情况下,使用 jpaTemplate 的 persist 方法,却是没有反应的。 这个是为什么呢, 马上想到的是,事务根本没有启动,没有启动》??? 不是已经设置了 @Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class) 了么。 可是,spring的配置中没有 注明 aop ,因为要切入事务,必需要aop的支持,现在我们使用的是 注解 方法实现 声明式事务 现在,只要加入aop的支持便可以了。 在配置文件中加入: <tx:annotation-driven/> 不要忘记导入相应的包: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主要是针对类的代理。 |
|