Hibernate session.createSQLQuery

У меня два проекта, maven.

  • A - приложение для отдыха, использующее спящий режим 5.2.16.FINAL, включая B (исключая его спящий режим)
  • B - библиотека, использующая спящий режим 4.3.9

Проект 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.

Есть идеи от кого-нибудь?

Спасибо.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
1 316
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Возможно, вам потребуется скомпилировать оба проекта с использованием одной и той же версии 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, который вы используете во время выполнения.

думал так может что то с компиляцией

aRagornol 17.04.2018 15:10

сравнение байт-кода действительно показало это довольно хорошо. еще раз спасибо

aRagornol 17.04.2018 15:20

Другие вопросы по теме