【问题标题】:Upgrade to Hibernate 3.6 errors with reverse engineering逆向工程升级到 Hibernate 3.6 错误
【发布时间】:2012-07-26 14:49:36
【问题描述】:

我在各个站点上发现了一些似乎涉及此问题的线程,但我没有运气。似乎它根本无法完成。我明白了 Caused by: java.lang.IncompatibleClassChangeError: Found interface org.hibernate.cfg.Mappings, but class was expected 错误。查看compatability matrix Shown in this thread. 似乎我不能使用 reveng,除非我降级。但这似乎不对。

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

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..

这是完整的堆栈跟踪:

    ...   
    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)
    ... 

蚂蚁:

<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>

任何帮助都会很棒;这台电脑即将被扔掉。谢谢大家。

【问题讨论】:

    标签: java spring hibernate hibernate3


    【解决方案1】:

    link. Max,hibernate 的贡献者之一,状态(靠近线程底部):

    “问题在于 Hibernate 3.6 从类到接口有一个类变化,这意味着它与 Hibernate Tools 源代码兼容但二进制不兼容。

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

    因此,“解决方法”是当您需要使用 hibernate 工具生成代码时,不要在类路径中包含 hibernate 3.6;生成的代码可以在 3.6 之后正常使用。

    挑战在于,如果我们添加 3.6 支持,我们也会失去 3.3-3.5 支持。 因此,目前我们不会更新,但会尝试看看我们能做些什么。”

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

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

    【讨论】:

      【解决方案2】:

      jar 名称不同的事实并不意味着它们不能包含完全相同的类。

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

      我会先删除hibernate-tools.jarslf4j-api-1.6.6.jar,甚至可能删除commons-logging-1.0.4.jar,然后看看你是否得到ClassNotFoundException,你可以添加特定的所需jar。

      【讨论】:

      • AFAIK hibernate-tools.jar 是唯一包含 org.hibernate.tool.ant.HibernateToolTask​​ 的 jar。对于 Hib 3.6+,您应该使用 EnversHibernateToolTask​​(它扩展了 HibernateToolTask​​),但这意味着您仍然需要包含 hibernate-tools.jar 并且不能解决问题。
      • 这两个都给了我不同的类未找到异常,与我删除的两个罐子有关。正如 sqrfv 指出的那样,我需要在其中安装 hibernate-tools 才能访问 HibernateToolTask​​ 基类。
      • 你使用的是什么版本的hibernate-tools.jar?
      • 很遗憾,它没有在 meta-inf 中指定,也没有指定。但我会冒险猜测 3.3 或 3.2 中的那个。
      • 我的猜测是你使用了错误的版本。例如,我知道 hibernate-3.3.2.jar 与 hibernate-tools-3.2.4.GA.jar 一起使用。你知道hibernate3.jar版本吗?
      猜你喜欢
      • 2016-06-18
      • 2011-10-28
      • 1970-01-01
      • 2015-09-27
      • 2012-03-15
      • 1970-01-01
      • 2011-07-18
      • 1970-01-01
      • 2015-02-11
      相关资源
      最近更新 更多