hibernate某些版本(4.3)下报错 NoSuchMethodError: javax.persistence.Table.indexes()

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

现象:

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>

  

好使!问题终于解决!

时间: 2024-11-10 02:44:04

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

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

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

高版本-&gt;低版本迁移,低版本客户端连接高版本数据库EXP导出报错EXP-00008,ORA-01455,EXP-00000

生产环境: 源数据库:RHEL + Oracle 11.2.0.3 目标数据库:HP-UX + Oracle 10.2.0.4 需求:迁移部分表  11.2.0.3-->10.2.0.4,若迁移范围内的有些表在目标库已经存在,则替换. 本次迁移数据量<1G. 初定方案:低版本的客户端连接到高版本数据库,用低版本导出,低版本导入. 1.采用初定方案,目标数据库所在服务器连接到源数据库,exp导出过程中报错. ZJCRNOPDB 36: sqlplus -version SQL*Plus: Rel

C3P0在linux下报错:Name or service not known

CentOS监视Tomcat当前命令行输出 tail -f .../apache-tomcat-x.x.x/logs/catalina.out C3P0在Linux下的主要错误内容 31-Jul-2014 14:14:43.072 INFO [localhost-startStop-1] com.mchange.v2.c3p0.impl.C3P0ImplUtils.generateVmId Failed to get local InetAddress for VMID. This is unl

WebUploader IE9下报错

WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件.在项目中,推荐并一直在使用WebUploader进行文件上传业务开发. 当然由于一些人为的使用不当,也会导致一些小问题.小记下. 1.WebUploader IE9下报错,具体报了哪一行错误忘记了,错误是flash内部的一个上传方法不存在. a.遇到错误,调试到对应行时,第一感觉就是这个问题无解,以为是IE9下有BUG,但是想想网上也没有相关的说法并且项目中IE9下面

64位系统下报错:cannot load OCI DLL,126

64位系统下报错:cannot load OCI DLL,126 解决方法:navicat 菜单中 -工具->选项->OCI 选择oracle安装目录下bin里面的oci.dll 查看上述链接页面提示,Navicat only support 32-bit instant client, 因此,尽管我们安装了64位的Oracle,但由于Navicat仅支持32位的,因此我们还需下载一个oracle的32位的客户端, 下载地址:http://www.oracle.com/technetwork/

PLSQL Developer下报错信息显示乱码问题

连接环境:win 7 数据库版本:oracle 11g 模拟一个错误,查看错误提示显示"????"乱码问题,如下: 检查: 1.V$NLS_PARAMETERS 为了显示中文,NLS_LANGUAGE应该为SIMPLIFIED CHINESE 2.进入注册表查看语言 在电脑"开始"菜单里找到"运行",然后在对话框里输入"regedit"就能打开电脑注册表了.依次单击HKEY_LOCAL_MACHINE --->SOFTW

Android程序能够构建和运行,但是报以下报错,为什么?

安卓程序写完之后能够构建和运行,但是会报以下的错误.不知道原因为何?求大神解答. 网上说的是混淆编译的原因,不过程序没有开启混淆编译. Error:warning: Ignoring InnerClasses attribute for an anonymous inner class Error:(com.alipay.android.phone.mrpc.core.c) that doesn't come with an Error:associated EnclosingMethod at

C#开发之问题汇总-降低NetFramework版本后,没有报错,生成失败

问题:-降低NetFramework版本后,没有报错,生成失败 原因:由于引用的dll与NET Framework版本不一致,导致,没有报错,但是生成失败 视图->输出,中能看到具体出错如下: 4>C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(1819,5): warning MSB3275: 未能解析主引用"D:\workspace\练习\ServerManager_E

js插件设置innerHTML时,在IE8下报错“未知运行时错误”

问题描述: 网站中使用了一个js插件,设置innerHTML时,在IE8下报错“未知运行时错误”: <div id=”divContainer”> <a name=”link”> -->报错处 第三方插件内容… </a> </div> 原因: 所设置的innerHTML的对象是一个<a>,是由于<a>的对象包容性的比较低,当浏览器运行这段脚本时,校验出了运行时错误. 解决方法: 将<a>标签替换为<div>