首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过逆向工程升级到Hibernate 3.6错误

通过逆向工程升级到Hibernate 3.6错误
EN

Stack Overflow用户
提问于 2012-07-28 05:43:02
回答 2查看 2.2K关注 0票数 4

我在不同的网站上找到了一些关于这个问题的帖子,但我没有运气。这似乎是根本不可能做到的。我得到了Caused by: java.lang.IncompatibleClassChangeError: Found interface org.hibernate.cfg.Mappings, but class was expected错误。看着Shown in this thread.compatability matrix ,我似乎不能使用reveng,除非我降级。但这看起来是不对的。

当我开始升级的时候,一切都正常,现在我得到了同样的错误。我确保在我的类路径中没有两个同名的不同jars。我有以下罐子:

代码语言:javascript
复制
commons-logging-1.0.4.jar
dom4j-1.6.1.jar
hibernate3.jar
hibernate-tools.jar    
slf4j-api-1.6.6.jar
slf4j-log4j12-1.6.6.jar
sqljdbc4.jar
other various jars not dealing with hibernate..

下面是完整的堆栈跟踪:

代码语言:javascript
复制
    ...   
    hibernatetool
    Executing Hibernate Tool with a JDBC Configuration (for reverse engineering)
    1. task: hbm2hbmxml (Generates a set of hbm.xml files)     java.lang.IncompatibleClassChangeError: Found interface org.hibernate.cfg.Mappings, but class was expected
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:116)
    at org.apache.tools.ant.Task.perform(Task.java:348)
    at org.apache.tools.ant.Target.execute(Target.java:390)
    at org.apache.tools.ant.Target.performTasks(Target.java:411)
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399)
    at org.apache.tools.ant.Project.executeTarget(Project.java:1368)
    at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
    at org.apache.tools.ant.Project.executeTargets(Project.java:1251)
    at org.apache.tools.ant.Main.runBuild(Main.java:809)
    at org.apache.tools.ant.Main.startAnt(Main.java:217)
    at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280)
    at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at com.intellij.rt.ant.execution.AntMain2.main(AntMain2.java:29)
Caused by: java.lang.IncompatibleClassChangeError: Found interface org.hibernate.cfg.Mappings, but class was expected
    at org.hibernate.cfg.reveng.MappingsDatabaseCollector.getTable(MappingsDatabaseCollector.java:25)
    at org.hibernate.cfg.reveng.JDBCReader.processTables(JDBCReader.java:535)
    at org.hibernate.cfg.reveng.JDBCReader.readDatabaseSchema(JDBCReader.java:74)
    at org.hibernate.cfg.reveng.JDBCReader.readDatabaseSchema(JDBCReader.java:860)
    at org.hibernate.cfg.JDBCBinder.readDatabaseSchema(JDBCBinder.java:121)
    at org.hibernate.cfg.JDBCBinder.readFromDatabase(JDBCBinder.java:94)
    ... 

蚂蚁:

代码语言:javascript
复制
<taskdef name="hibernatetool" classname="org.hibernate.tool.ant.HibernateToolTask" classpathref="classpath" />
...
 <hibernatetool>
    <jdbcconfiguration configurationfile="${conf.dir}/${dbName}_hibernate-template.cfg.xml" packagename="myPackageName" revengfile="${conf.dir}/hibernate.reveng.xml" reversestrategy="com.capitaliq.loader.dev.codegen.HibernateReverseStrategy" detectmanytomany="false" />
    <hbm2hbmxml destdir="${srcGen.dir}" />
    <!-- Generate new hibernate.cfg.xml including new POJOs-->
    <!--'destdir' is relative to 'packagename' configuration-->
    <hbm2cfgxml ejb3="false" destdir="${conf.dir}" />
</hibernatetool>

<!-- Generate java POJOs from mapping files-->
<hibernatetool> <!--Line 384-->
    <configuration configurationfile="${conf.dir}/${dbName}_hibernate-template.cfg.xml">
        <fileset dir="${orm.pkg.dir}">
            <include name="**/*.hbm.xml" />
        </fileset>
    </configuration>
    <!--'destdir' is relative to 'packagename' configuration-->
    <hbm2java jdk5="true" ejb3="false" destdir="${srcGen.dir}" />
</hibernatetool>

任何帮助都是很好的;这台计算机即将被抛出。谢谢你们。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-01 01:32:59

根据这个link. Max,hibernate的一个贡献者声明(接近线程的底部):

“问题是Hibernate 3.6的类从类到接口都有变化,这意味着它与Hibernate工具是源代码兼容的,但不是二进制兼容的。

加上其他二进制更改会导致此问题,并记录在https://issues.jboss.org/browse/JBIDE-8071

因此,“变通办法”是,当您需要使用hibernate工具生成代码时,不要在类路径中包含hibernate 3.6;生成的代码可以在之后的3.6中很好地使用。

挑战是,如果我们增加3.6支持,我们也会失去3.3-3.5支持。因此,目前我们不会更新,但会试着看看我们能做些什么。“

看起来我是在尝试做不可能的事情。虽然我很高兴我终于得到了答案,但我很遗憾地说,这不是我希望的那个答案。

一个人不能将两个jars放在同一个类路径上,即使它们彼此依赖。如果你想对一些hibernate代码进行逆向工程,最好不要使用hibernate 3.6版!

票数 3
EN

Stack Overflow用户

发布于 2012-07-30 23:23:34

jars不具有相同的名称并不意味着它们不能包含完全相同的类。

Hibernate和SLF4J通常只需要使用一个jar。其他jar通常包含来自大型主jar的类的一部分,也可能包含用于特定任务的一些额外类。

我会从删除hibernate-tools.jarslf4j-api-1.6.6.jar开始,甚至可能删除commons-logging-1.0.4.jar,然后看看如果您获得了ClassNotFoundException,就可以添加所需的特定jar。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11696033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档