其实本来没啥大问题,但到网上查的时候发现了一些误人子弟的说法,所以还是记下来吧。

现象:

hibernate从低版本升级到某一个版本时(我们是升到4.3.10)时,在程序启动时会报错:
java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;
 
于是查资料,网上也有许多人遇到同样的错误,并且发现的原因是在model中使用了@Table(name="xxx")这个注解所致,于是推荐的改法是将这个标签去掉,改用@Entity(name="xxx")这个注解,甚至有人说是新版的hibernate不支持@Table这个注解了。
 
其实不然。
 
在Hibernate的新新官方文档中,明确提到了@Table这个注解:
@Table lets you define the table the entity will be persisted into. If undefined, the table name is the unqualified class name of the entity.
 
当然你可以不写这个注解,那么表名默认就是非限定类名(也就是不带包的类名)。但企图使用@Entity(name="xxx")来代替,把这里的xxx作为表名来看却是大错特错了,@Entity中的nama属性表示的是重新定义实体名:
@Entity.name lets you define the shortcut name of the entity you can use in JP-QL and HQL queries. It defaults to the unqualified class name of the class.
 
这里的默认也是非限定类名。这个实体名就是你在Hql中使用的(比如“from xxx")那个model名称,一般这个名称不要重新定义,直接用类名就OK,更不要把它当做表名,除非你的表名和实体名一模一样。
 
回到那个异常,这个问题如何解决呢?可以肯定的是,这个问题是由jar包冲突引起的,hibernate的注解基础部分现在都采用JPA的注解了,JPA是属于javaEE的一部分,许多javaEE的包中也包括了JPA 的相关API,这个问题可能就是由于项目中存在javaEE相关的jar包,与hibernate所包含的JPA相关的jar包版本有冲突。
 
解决办法一:删除冲突的jar包
首先排查下项目Lib库,发现类似的jar包要检查下,比如有人发现这些包ejb3-persistence.jar,javaee.jar,可以解开看一下,如果里面有javax.persistence这个包名,估计就找到问题jar包了。处理方法要么把这些包删除,如果一定需要,那也要升级个别的版本试试,或者把jar包里的java.persistence下样关的内容删除,再重新打包。
 
 
解决办法二:针对resin服务器中的jar包冲突
但我们项目遇到了更怪僻的问题,lib库中没有相关的javaee包,无法用上面所说的方法。找来找去,终于发现,我们用的resin服务器,resin自带的系统库里有一个javaee-16.jar的包。但不论是删除这个Jar包还是重新编译,resin均报错。又google出去,终于找到解决方法:
在resin.xml文件最后加上一句:
 
<class-loader>
<servlet-hack/>
</class-loader>

  

 
 
好使!问题终于解决!

hibernate某些版本(4.3)下报错 NoSuchMethodError: javax.persistence.Table.indexes()的更多相关文章

  1. resin下发布项目报错java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index

    我的resin版本为4.0.56; 项目在tomcat下启动正常,打包在resin下发布时报错:java.lang.NoSuchMethodError: javax.persistence.Table ...

  2. 使用EL表达式正确情况下报错:javax.servlet.jsp cannot be resolved to a type

    这个错误可能是服务器自带的servlet库未导入的原因.右键项目属性,转到Targeted Runtimes,选择一个服务器,例如Tomcat,单击应用,可能就可以解决.

  3. pymysql下报错:numpy.float64 object has no attribute 'translate' 可能是pandas版本的问题

    pymysql下报错:numpy.float64 object has no attribute 'translate'.定位到db.merge函数中,dataframe中浮点型元素的类型为numpy ...

  4. 关于Hibernate 5 和 Hibernate 4 在创建SessionFactory的不同点分析(解决 org.hibernate.MappingException: Unknown entity: xx类报错问题)

    Hibernate4版本的SessionFactory实例构建的步骤是这样的(也是很多学习资料的通用范本): //Configuration就是代表着hibernate的那个xml配置文件对象,如果c ...

  5. jquery.validate.js在IE8下报错不运行

    因为项目要表单验证,所以特意去找了jquery.validate这个应该是jquery官方团队出品的表单验证插件. 实际应用时,却在IE8调试时碰到了问题. 从jquery.validate官网下载了 ...

  6. WebUploader IE9下报错

    WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件.在项目中,推荐并一直在使用WebUploader进行文件上传业务开发. ...

  7. macos版本mojave 安装postgres报错

    mac os 版本mojave 安装postgres报错 事由:前几天升级mac到mojave版本也就是10.14系统,发现对于很多原系统的软件包都不兼容,安装时出现报错. 报错: pthread.h ...

  8. JavaScript在IE6,IE7下报错'expected identifier, string or number'

    问题: 代码在Forefox和IE8下工作正常,但是在IE6下报错: expected identifier, string or number 假如变量options有多个选项,那么我们可以用逗号分 ...

  9. Linux 下报错:A Java RunTime Environment (JRE) or Java Development Kit (JDK) must解决方案

    一.报错环境:在Linux mint下,前几天还用得很好的的eclipse,今天开机不知为什么这样. Linux 下报错:A Java RunTime Environment (JRE) or Jav ...

随机推荐

  1. [Immutable,js] Iterating Over an Immutable.js Map()

    Immutable.js provides several methods to iterate over an Immutable.Map(). These also apply to the ot ...

  2. iPhone图形开发绘图小结

    iPhone图形开发绘图教程是本文要介绍的内容,介绍了很多关于绘图类的使用,先来看详细内容讲解. 1.绘图总结: 绘图前设置: CGContextSetRGBFillColor/CGContextSe ...

  3. Linux各个目录的作用

      /binbin是binary的缩写.这个目录沿袭了UNIX系统的结构,存放着使用者最经常使用的命令.例如cp.ls.cat,等等./boot这里存放的是启动Linux时使用的一些核心文件./dev ...

  4. SVG Loading

    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="64&qu ...

  5. hitTest:withEvent:方法(此方法可实现点击穿透、点击下层视图功能)

    此方法可实现点击穿透.点击下层视图功能 一. hitTest:withEvent:调用过程 iOS系统检测到手指触摸(Touch)操作时会将其放入当前活动Application的事件队列,UIAppl ...

  6. 自己对WSO2 ESB 见解

    这周没想到要更新什么内容,就把我最近工作接触的WSO2 ESB简单介绍下吧.     前提: 一切文档,知识都要与官方文档为准. WSO2 ESB: http://wso2.com/products/ ...

  7. mysql中查看字符集的cmd指令

    参看下面链接:http://blog.chinaunix.net/uid-20180960-id-1972668.html

  8. Myeclipse中如何修改Tomcat的端口号

    一,使用 Myeclipse 中自带的 tomcat 右键 configure 弹出窗口 在 port Number 中修改 端口号即可: 二,配置的 tomcat 如果用上述的方法,只能打开这样的窗 ...

  9. JAVA操作properties文件

    va中的properties文件是一种配置文件,主要用于表达配置信息,文件类型为*.properties,格式为文本文件,文件的内容是格式是"键=值"的格式,在properties ...

  10. nginx+keepalived+tomcat之具体配置档

    前沿知识点: nginx负责负载均衡(反向代理) msm(memcached session manager)负责缓存会话信息,从而实现会话保持 所需包: nginx和memcached采用最新稳定版 ...