Обновление до ошибок Hibernate 3.6 с обратным инжинирингом
Я нашел несколько тем на разных сайтах, которые, кажется, касаются этой проблемы, но мне не повезло. Кажется, что это просто невозможно сделать. Я получаю Caused by: java.lang.IncompatibleClassChangeError: Found interface org.hibernate.cfg.Mappings, but class was expected
ошибка. Глядя на матрицу совместимости, показанную в этой теме. кажется, что я не могу использовать месть, если я не понижаю. Но это не может показаться правильным.
Когда я начал обновление, все работало, и теперь я получаю ту же ошибку. Я позаботился о том, чтобы на пути к классу не было двух разных банок с одинаковыми именами. У меня есть следующие банки:
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>
Любая помощь будет великолепна; этот компьютер вот-вот будет брошен. Спасибо, парни.
2 ответа
По этой ссылке. Макс, один из авторов спящего режима, утверждает (в нижней части цепочки):
"Проблема в том, что Hibernate 3.6 имеет изменение класса от класса к интерфейсу, что означает, что он совместим с исходным кодом, но не совместим с бинарным с Hibernate Tools.
Этот плюс другие двоичные изменения вызывает эту проблему и записывается в https://issues.jboss.org/browse/JBIDE-8071
Таким образом, "обходной путь" - это когда вам нужно сгенерировать код с помощью инструментов гибернации, тогда не включайте спящий режим 3.6 в путь к классам; результирующий код может быть использован отлично с 3,6 впоследствии.
Проблема в том, что если бы мы добавили поддержку 3,6, мы бы тоже потеряли поддержку 3,3-3,5. Таким образом, на данный момент мы не обновляем, но попробуем и посмотрим, что мы можем сделать в будущем ".
Похоже, я пытался сделать невозможное. Хотя я рад, что наконец получил ответ, с сожалением могу сказать, что это не тот ответ, на который я надеялся.
Нельзя иметь две банки на одном и том же пути к классам, даже если они зависят друг от друга. Если вы хотите выполнить обратный инжиниринг кода гибернации, лучше не использовать версию 3.6 гибернации!
Тот факт, что банки не имеют одинакового имени, не означает, что они не могут содержать одинаковые классы.
Hibernate и SLF4J обычно требуют использования только одной банки. Другие банки обычно содержат часть классов из большой основной банки и, возможно, некоторые дополнительные классы для конкретной задачи.
Я бы начал с удаления hibernate-tools.jar
а также slf4j-api-1.6.6.jar
и может быть даже commons-logging-1.0.4.jar
а затем посмотреть, если вы получите ClassNotFoundException
Вы можете добавить конкретную необходимую банку.