У меня два проекта, maven.
Проект A создает собственный контекст, который импортирует DBConfig (копию Bs), заменяя B, чтобы использовать правильный hibernate5.HibernateTransactionManager, hibernate5.LocalSessionFactoryBean
Проект A выполняет вызов службы в B -> DAO -> получить сеанс -> createSQLQuery. Это не срабатывает с
java.lang.NoSuchMethodError: org.hibernate.Session.createSQLQuery(Ljava/lang/String;)Lorg/hibernate/SQLQuery;
Когда я меняю спящий режим на 5.2.16 в B без каких-либо дополнительных изменений кода, он работает, или если я перемещаю DAO из B в A (также с правильной конфигурацией в контексте - включая перемещенный DAO и исключая один из B - из-за дублирования имени bean-компонента), он тоже работает ?!
Как такое возможно? Я действительно чего-то не понимаю или упускаю. Без каких-либо изменений кода в проекте B только с конфигурацией зависимости maven hibernate (которая исключена в A, как я сказал выше) код либо запускается, либо терпит неудачу в DAO.createSQLQuery.
Есть идеи от кого-нибудь?
Спасибо.




Возможно, вам потребуется скомпилировать оба проекта с использованием одной и той же версии Hibernate.
Почему java.lang.NoSuchMethodError возникает в вашем случае: createSQLQuery определяется несколько иначе в 4.3 (http://docs.jboss.org/hibernate/orm/4.3/javadocs/org/hibernate/SharedSessionContract.html) и 5.2 (http://docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/query/QueryProducer.html). Обратите внимание, что тип возврата отличается.
Во время компиляции вызов метода разрешается правильно, если используется любая версия. Это связано с тем, что тип возвращаемого значения, используемый 5.2 (NativeQuery), расширяет тип возвращаемого значения, используемый 4.3 (SQLQuery). Однако, как только B скомпилирован с 4.3, он ссылается на createSQLQuery, определенный в 4.3 (SQLQuery createSQLQuery(String)) и который не может быть найден в 5.2, который вы используете во время выполнения.
сравнение байт-кода действительно показало это довольно хорошо. еще раз спасибо
думал так может что то с компиляцией