分享

Spring+Hibernate+JPA常见小问题

 暖风醉伊人 2013-03-11
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主要是针对类的代理。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多