Отключение контекстного создания LOB, поскольку метод createClob () вызывал ошибку

87

Я использую Hibernate 3.5.6 с Oracle 10g. Во время инициализации я вижу исключение ниже, но само приложение работает нормально. В чем причина этого исключения? и как это можно исправить?

Исключение
Отключение контекстного создания LOB, поскольку createClob()метод вызвал ошибку:java.lang.reflect.InvocationTargetException

Информация
Версия Oracle: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 Драйвер JDBC: Драйвер Oracle JDBC, версия: 11.1.0.7.0

ГириБякс
источник
«само приложение работает нормально» ... я полагаю, пока вы не пытаетесь использовать LOB.
Nyerguds

Ответы:

76

Отключите это предупреждение, добавив свойство ниже.

Для приложения Spring:

spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false

Нормальный JPA:

hibernate.temp.use_jdbc_metadata_defaults=false
Нараян Еррабачу
источник
1
С какой версией java вы это пробовали? Intellij не может найти это свойство.
comiventor 06
Мы пробовали использовать eclipse, а также Intellij. В обоих случаях он работает. На самом деле, мы устали от java 6, 7,8, и он работает без проблем для нас. Просто отладьте свой код или перепроверьте его.
Нараян Еррабачу
67

Как вы заметили, это исключение не является реальной проблемой. Это происходит во время загрузки, когда Hibernate пытается получить некоторую метаинформацию из базы данных. Если это вас раздражает, вы можете отключить его:

hibernate.temp.use_jdbc_metadata_defaults false
jpkrohling
источник
1
Спасибо Партенону. Мне известно о возможности его отключения, но я пытаюсь найти причину этого исключения. Есть указатели?
GiriByaks 04
6
Насколько я понимаю, это не проблема вашего приложения, Hibernate просто проверяет, поддерживает ли БД некоторые функции, и настраивается, если это не так. Я бы проверил, запускает ли это какое-либо отображение (например, поле LOB), но это не о чем беспокоиться.
jpkrohling 04
5
ВНИМАНИЕ ! Использование этого решения с Oracle опасно ! Это приводит к неожиданным COMMIT . Когда hibernate создает временные таблицы, он должен открыть новую транзакцию, поскольку операторы DDL в Oracle DB подразумевают COMMIT. Установив для этого параметра значение false, вы отключаете открытие новой транзакции, и DDL будет вызывать проблемы в вашей транзакции, COMMITING ее.
Борис Бродский
@BorisBrodski, вы уверены, что описанное вами поведение вызвано установкой для этого свойства значения false? Глядя на код, я не вижу, чтобы выполнялось что-либо дополнительное, если это неверно: github.com/hibernate/hibernate-orm/blob/… .
jpkrohling
3
@jpkrohling Да, я отлажена hibernate4.2.7 и пилу , если сам: Установка useJdbcMetadataдля falseпредотвращает , metaReportsDDLCausesTxnCommitчтобы установить , и он остается false! grepcode.com/file/repo1.maven.org/maven2/org.hibernate/…
Борис Бродский 07
28

Глядя на комментарии в источнике :

В основном здесь мы просто проверяем, можем ли мы вызвать методы java.sql.Connection для создания LOB, добавленные в JDBC 4. Мы не только проверяем, объявляет ли java.sql.Connection эти методы, но также и то, действительно ли java.sql.Connection instance реализует их (т.е. может быть вызван без простой генерации исключения).

Итак, он пытается определить, может ли он использовать какие-то новые методы JDBC 4. Думаю, ваш драйвер может не поддерживать новый метод создания больших объектов.

Стив К
источник
5
Значит ли это что Driver does not support LOB featureили Database does not support LOB feature?
Марек Себера
@MarekSebera Драйвер. У меня эта проблема, потому что что-то загадочным образом заменяет мою библиотеку C3P0 старой версией. База данных прекрасно это поддерживает.
Nyerguds
24

Чтобы скрыть исключение:

Для Hibernate 5.2 (и Spring Boot 2.0) вы можете использовать свойство use_jdbc_metadata_defaults , на которое указали другие:

# Meant to hide HHH000424: Disabling contextual LOB creation as createClob() method threw error 
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults: false

Или, если вы хотите, чтобы у вас не было никаких побочных эффектов от вышеуказанного параметра (есть комментарий, предупреждающий нас о некоторых побочных эффектах Oracle, я не знаю, действителен он или нет), вы можете просто отключить ведение журнала исключения, подобного этому :

logging:
   level: 
      # Hides HHH000424: Disabling contextual LOB creation as createClob() method threw error 
      org.hibernate.engine.jdbc.env.internal.LobCreatorBuilderImpl: WARN
Влад Динулеску
источник
21

Чтобы избавиться от исключения

INFO - HHH000424: Disabling contextual LOB creation as createClob() method threw error :java.lang.reflect.InvocationTargetException

В hibernate.cfg.xmlфайле Добавить ниже свойство

<property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>
УдайКиран Пулипати
источник
5
Это тот же ответ, что и у Стива К. Почему вы отвечаете на него снова?
Bevor
4
@Bevor он объяснил проблему, но я дал ответ.
УдайКиран Пулипати
2
Вам нужно только командовать обновлениями, скопировав уже данный ответ. Ваш ответ не отличается от ответа Стива К.
Бевор
2
Спасибо. Исходя из этого, я добавил <property name="hibernate.temp.use_jdbc_metadata_defaults" value="false" /> в persistence.xmlфайл, и это решило проблему для меня. Я использую JPA с Hibernate.
dschulz
4
@Bevor, если честно, для такого новичка, как я, этот ответ намного яснее отчасти, где я должен разместить эту собственность
Анатолий Якимчук
14

Обновите это для использования Hibernate 4.3.x / 5.0.x - вы можете просто установить для этого свойства значение true:

<prop key="hibernate.jdbc.lob.non_contextual_creation">true</prop>

чтобы избавиться от этого сообщения об ошибке. Тот же эффект, но без детали "брошенное исключение". Подробности см. В источнике LobCreatorBuilder.

Торстен Кра
источник
установите это в persistence.xml
user961954
10

Просто добавьте строку ниже в application.properties

spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults: false
Рупеш Патил
источник
6

Как упоминалось в других комментариях, используя

hibernate.temp.use_jdbc_metadata_defaults = false

... исправит раздражающее сообщение, но может привести ко многим другим неожиданным проблемам. Лучшее решение - просто отключить создание контекстного LOB следующим образом:

hibernate.jdbc.lob.non_contextual_creation = true

Это заставит Hibernate (в моем случае это 5.3.10.Final) пропустить проверку драйвера JDBC и просто вывести следующее сообщение:

HHH000421: Disabling contextual LOB creation as hibernate.jdbc.lob.non_contextual_creation is true

Пока похоже, что эта настройка не вызывает никаких проблем.

Яцек Пруча
источник
4

Если вы установите:

hibernate.temp.use_jdbc_metadata_defaults: false

это может вызвать проблемы с PostgreSQL, если имя вашей таблицы содержит зарезервированное слово, например user. После вставки он попытается найти последовательность идентификаторов с помощью:

select currval('"user"_id_seq');

который, очевидно, потерпит неудачу. По крайней мере, с Hibernate 5.2.13 и Spring Boot 2.0.0.RC1. Не нашли другого способа предотвратить это сообщение, так что теперь просто игнорируйте его.

Кеттунен
источник
2

При работе с Spring boot 2.1.x это предупреждающее сообщение появляется при запуске приложения.

Как указано здесь, возможно, эта проблема не проявлялась в более ранних версиях, потому что связанное свойство было установлено в true по умолчанию, а теперь оно false:

https://github.com/spring-projects/spring-boot/issues/12007

Следовательно, решить эту проблему так же просто, как добавить следующее свойство в файл spring application.property.

spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation = true
мигельдоктор
источник
Спасибо за это. Трассировка исключения в режиме журнала INFO действительно раздражает!
Даниэль Фернандес,
1

Проблема возникает из-за того, что вы не выбрали соответствующий JDBC. Просто скачайте и используйте JDBC для Oracle 10g, а не 11g.

саами
источник
Ага. Это полностью противоречит ответу Бориса Бродского. Вы уверены, что это имеет значение?
Nyerguds
1

Я использую hibernate 5.3.17, и он отлично работает, добавляя заданные свойства

hibernate.default_entity_mode=dynamic-map
hibernate.temp.use_jdbc_metadata_defaults=true
hibernate.jdbc.lob.non_contextual_creation = true

Благодарность

SK
источник
0

Я столкнулся с этой ошибкой, когда мое веб-приложение было запущено в Linux пользователем, вошедшим в систему с недостаточными правами доступа. Эта ошибка

org.hibernate.engine.jdbc.internal.LobCreatorBuilder - HHH000424: отключение контекстного создания LOB в качестве метода createClob () вызывало ошибку: java.lang.reflect.InvocationTargetException

обычно предшествуют другие ошибки / исключения, особенно с вашего сервера приложений, т.е. для Tomcat:

org.apache.catalina.LifecycleException: не удалось инициализировать компонент ...

или

java.lang.UnsatisfiedLinkError: ... невозможно открыть файл общих объектов: нет такого файла или каталога

Решение:

  1. Остановите текущий экземпляр вашего веб-приложения.

  2. Войдите в систему с суперпользователем или теми, у кого есть достаточные права доступа, т.е. root

  3. Перезапустите веб-приложение или снова вызовите предыдущую функцию.

Питеронг
источник
0

Для тех, кто сталкивается с этой проблемой с Spring Boot 2

по умолчанию весенняя загрузка использовала версию hibernate 5.3.x, я добавил следующее свойство в свой pom.xml

<hibernate.version>5.4.2.Final</hibernate.version>

и ошибка исчезла. Причина ошибки уже объяснена в сообщениях выше

Шайлеш Чандра
источник
-1

Удалите аннотации @Temporal, если вы используете их с классами java.sql. *.

Амр Эль-Демердаш
источник
-3

Проверьте, не используете ли вы VPN. У меня была такая же проблема, но я понял, что db подключался к удаленному!

logixplayer
источник