Вимкнення контекстного створення LOB як метод createClob () викликав помилку


87

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

Виняток
Вимкнення контекстного створення LOB як createClob()помилки методу:java.lang.reflect.InvocationTargetException

Інформація
Версія Oracle: Драйвер Oracle Database 10g Enterprise Edition, випуск 10.2.0.4.0 JDBC: Драйвер Oracle JDBC, версія: 11.1.0.7.0


"сама програма працює нормально" ... поки я не намагаюся використовувати LOB, я думаю.
Nyerguds

Відповіді:


76

Вимкніть це попередження, додавши властивість нижче.

Для весняного застосування:

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

Звичайний JPA:

hibernate.temp.use_jdbc_metadata_defaults=false

1
З якою версією Java ви спробували це? Intellij не може знайти цю властивість.
комітент

Ми пробували з eclipse так само, як і Intellij. В обох випадках він працює. Насправді, ми втомилися з Java 6, 7,8 і його роботою без проблем для нас. Просто налагодьте свій код або перевірте свій код.
Narayan Yerrabachu

67

Як ви помітили, цей виняток не є реальною проблемою. Це відбувається під час завантаження, коли Hibernate намагається отримати деяку метаінформацію з бази даних. Якщо вас це дратує, ви можете вимкнути це:

hibernate.temp.use_jdbc_metadata_defaults false

1
Дякую Партенону. Мені відомо про можливість його відключити, але я намагаюся знайти причину цього винятку. Будь-які вказівники?
GiriByaks

6
Наскільки я розумію, це не проблема з вашим додатком, Hibernate просто перевіряє, чи підтримує БД деякі функції, та налаштовується на випадок, якщо цього не робить. Я б перевірив, чи якесь відображення ініціює це (як поле LOB), але це ні про що турбуватися.
jpkrohling

5
ПОПЕРЕДЖЕННЯ : Використання цього рішення з Oracle небезпечно ! Це призводить до несподіваних комітів . Коли сплячий режим створює тимчасові таблиці, він повинен відкрити нову транзакцію, оскільки оператори DDL у Oracle DB означають COMMIT. Встановивши для цієї опції значення false, ви відключаєте відкриття нової транзакції, а DDL отримує проблеми у вашій транзакції.
Борис Бродський

@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/…
Борис Бродський

28

Переглядаючи коментарі у джерелі :

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

Отже, він намагається визначити, чи може він використовувати деякі нові методи JDBC 4. Я думаю, ваш драйвер може не підтримувати новий метод створення LOB.


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
Це та сама відповідь, що і у Стіва К. Чому ви відповідаєте на це ще раз?
Бевор,

4
@Bevor він пояснив проблему, але я дав відповідь.
UdayKiran Pulipati

2
Вам потрібно лише командувати оновлення, скопіювавши вже дану відповідь. Ваша відповідь не відрізняє від Стіва К.
Бевор

2
Дякую. На основі цього я додав <property name="hibernate.temp.use_jdbc_metadata_defaults" value="false" /> до persistence.xmlфайлу, і він вирішив проблему для мене. Я використовую JPA з Hibernate.
dschulz

4
@Будьте чесними, для такого новачка, як я, ця відповідь набагато зрозуміліша, зокрема, куди мені покласти це майно
Анатолій Якимчук

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, коли назва вашої таблиці містить зарезервоване слово, як користувач. Після вставки він спробує знайти послідовність ідентифікаторів за допомогою:

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

Я використовую сплячий режим 5.3.17, і він чудово працює, додаючи задані властивості

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

Дякую


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>

і помилка зникла. Причина помилки вже пояснена у публікаціях вище



-3

Перевірте, чи не користуєтеся ви VPN. У мене була та ж проблема, але я зрозумів, що дБ я підключав до віддаленого!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.