其实本来没啥大问题,但到网上查的时候发现了一些误人子弟的说法,所以还是记下来吧。
现象:
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在运行时加载了多个Guava库的不同版本,导致版本冲突。在服务器上,发现有多个Guava版本的JAR包,包括11、14、17、18、19、21和25。Azkaban本身使用的是`guava-21.0.jar`,但其他程序...
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....
5. **版本冲突**:在集成框架如Spring、Struts、Hibernate(SSH)的项目中,可能会遇到版本冲突导致的NoSuchMethodError。不同的库版本可能包含不同版本的类,从而导致方法不存在的问题。此时,检查并更新项目中的...
1. 导入了不匹配的包版本:当项目依赖的 jar 包版本不一致时,可能会导致 Java.lang.NoSuchMethodError 错误。 2. 开发环境和运行环境不一致:当开发环境和运行环境的配置不一致时,也可能会导致 Java.lang....
用于解决struts2升级至2.3.37时 出现java.lang.NoSuchMethodError: com.opensymphony.xwork2.ActionContext.put(Ljava/lang/异常时,更换的xwork-core-2.3.37.jar
ASM库的`ClassWriter`类的构造函数可能在某些情况下不兼容,导致`NoSuchMethodError`。CGlib 2.2 版本已经解决了这个问题,确保与Hibernate 3.2的兼容性。 `hibernate-3.2.0.ga.zip`是Hibernate 3.2的归档文件,GA...
3. **编译与运行环境不一致**:如果你在不同的JDK版本下进行编译和运行,可能会出现这个问题,因为不同JDK版本可能包含或移除了某些方法。 4. **混淆或优化代码**:在进行代码混淆或优化时,如果未正确处理方法调用...
java.lang.NoSuchMethodError: redis.clients.jedis.ScanResult.getStringCursor()Ljava/lang/String; at org.crazycake.shiro.WorkAloneRedisManager.keys(WorkAloneRedisManager.java:149) at org.crazycake....
其他版本itext可能会报错com.lowagie.text.pdf.BaseFont.getCharBBox(C),很多人都遇到过这样的问题,换成Itext2.0.8就可以了,只有Itext2.0.8才支持getCharBBox(char) ,其他的为getCharBBox(Int)
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....
本地HTML文件通常存储在`assets`目录下。 3. **设置Web视图** 为了在Activity中显示WebView,我们需要调用`setContentView()`方法,将WebView作为Activity的内容视图: ```java setContentView(webView); ``` ...
今天做项目,用到了el表达式和jstl,在tomcat6.0上跑得好好的,没想到copy到tomcat5.5后,服务器起不来了,是tomcat版本的问题。查阅了不少资料,现在总结如下: 错误信息: java.lang.NoClassDefFoundError: javax...
派遣 实用程序,使它们具有类型安全性,易于测试和更具表现力。 使用预定义的或定义您自己的,不要再注入Dispatchers对象。 val presenter = MyPresenter ( MainCoroutineScope ()) class MyPresenter @Inject ...
而`NoSuchMethodError`通常是因为编译时和运行时的类版本不匹配导致的。 总之,面对`NoClassDefFoundError`这样的运行时异常,开发者需要有扎实的Android和Java基础,以及对类加载机制的理解,才能快速定位问题并...