其实本来没啥大问题,但到网上查的时候发现了一些误人子弟的说法,所以还是记下来吧。
现象:
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>
好使!问题终于解决!
相关推荐
主要介绍了启动Azkaban报错:java.lang.NoSuchMethodError: com.google.common.collect.ImmutableMap.toImmutableMap,需要的朋友可以参考下
NULL 博文链接:https://albert0707.iteye.com/blog/562969
换成3.6.3 版本 解决 1) Error injecting constructor, java.lang.NoSuchMethodError: org.apache.maven.model.validation.DefaultModelValidator: method 'void ()' not found at org.jetbrains.idea.maven....
内含hibernate3.2与修复java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.(Z)V 的错误的cglib2.2
其他版本itext可能会报错com.lowagie.text.pdf.BaseFont.getCharBBox(C),很多人都遇到过这样的问题,换成Itext2.0.8就可以了,只有Itext2.0.8才支持getCharBBox(char) ,其他的为getCharBBox(Int)
java.lang.NoSuchMethodError异常处理要点
NULL 博文链接:https://sunrysoft.iteye.com/blog/1677989
主要介绍了解决 java.lang.NoSuchMethodError的错误的相关资料,需要的朋友可以参考下
Hibernate经典版 通过图解让你轻松学会Hibernate
解决java.lang.NoSuchMethodError: javax.ws.rs.core.Application.getProperties()Ljava/util/Map; 已经打包好的,放心使用,可反编译查看下
Tomcat要支持memcached管理Session,需要调用一些jar库文件如下(网上有的文章中可能所说的jar包不全,或者版本不样的会报错,但这里我已经经过验证了): 1) couchbase-client-1.2.2.jar 2) javolution-5.5.1....
java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String; java.lang.ClassNotFoundException: org.apache.jsp.index_jsp; 对于第一个问题,我上网查阅了很多资料...
今天做项目,用到了el表达式和jstl,在tomcat6.0上跑得好好的,没想到copy到tomcat5.5后,服务器起不来了,是tomcat版本的问题。查阅了不少资料,现在总结如下: 错误信息: java.lang.NoClassDefFoundError: javax...
派遣 实用程序,使它们具有类型安全性,易于测试和更具表现力。 使用预定义的或定义您自己的,不要再注入Dispatchers对象。 val presenter = MyPresenter ( MainCoroutineScope ()) class MyPresenter @Inject ...
问题如何解决:NoSuchMethodError: scala.collection.JavaConverters,版本不匹配错误;java.lang.NoClassDefFoundError:org/apache/hadoop/fs/FSDataInputStream,无Hadoop包错误 Project创建及配置: 1. 可通过...
java.lang.NoSuchMethodError: redis.clients.jedis.ScanResult.getStringCursor()Ljava/lang/String; at org.crazycake.shiro.WorkAloneRedisManager.keys(WorkAloneRedisManager.java:149) at org.crazycake....
WebView(网络视图)能加载显示网页,可以将其视为一个浏览器
登陆报错的问题 登录 java.lang.NoSuchMethodError: antlr.collections.AST.getLine()I 问题 导入数据库乱码解决方案: 人才管理系统项目详细文档说明 ========================================= 系统安装...
ZK 页面用ckeditor时提示组件未定义,引入ckez.jar可解决