Ответ 1
Отключите это предупреждение, добавив свойство ниже.
Для приложения Spring:
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false
Нормальный JPA:
hibernate.temp.use_jdbc_metadata_defaults=false
Я использую Hibernate 3.5.6 с Oracle 10g. Во время инициализации я вижу исключение ниже, но сам приложение работает нормально. В чем причина этого исключения? и как его можно исправить?
Exception
Отключение контекстного создания LOB как метода createClob()
вызвало ошибку: java.lang.reflect.InvocationTargetException
Info
Версия Oracle: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0
Драйвер JDBC: драйвер Oracle JDBC, версия: 11.1.0.7.0
Отключите это предупреждение, добавив свойство ниже.
Для приложения Spring:
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false
Нормальный JPA:
hibernate.temp.use_jdbc_metadata_defaults=false
Как вы заметили, это исключение не является реальной проблемой. Это происходит во время загрузки, когда Hibernate пытается получить некоторую метаинформацию из базы данных. Если это вас раздражает, вы можете отключить его:
hibernate.temp.use_jdbc_metadata_defaults false
Глядя на комментарии в источник:
В основном здесь мы просто проверяем можно ли назвать java.sql.Соединения для LOB создание добавлено в JDBC 4. Мы не только проверьте, есть ли соединение java.sql.Connection объявляет эти методы, но также действительно ли java.sql.Connection экземпляр реализует их (т.е. может быть не просто бросая исключение).
Итак, он пытается определить, может ли он использовать некоторые новые методы JDBC 4. Я думаю, ваш драйвер может не поддерживать новый метод создания LOB.
Чтобы избавиться от исключения
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>
Чтобы скрыть исключение:
Для 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
Обновите это для использования Hibernate 4.3.x/5.0.x - вы можете просто установить для этого свойства значение true:
<prop key="hibernate.jdbc.lob.non_contextual_creation">true</prop>
чтобы избавиться от этого сообщения об ошибке. Тот же эффект, но без детализации "бросил исключение". Подробнее см. В источнике LobCreatorBuilder.
Просто добавьте строку ниже в application.properties.
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults: false
Обновление драйвера JDBC до последней версии удалило неприятное сообщение об ошибке.
Вы можете скачать его здесь:
http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html
Требуется бесплатная регистрация.
Если вы установили:
hibernate.temp.use_jdbc_metadata_defaults: false
это может вызвать проблемы с PostgreSQL, когда ваше имя таблицы содержит зарезервированное слово, подобное пользователю. После вставки он попытается найти последовательность идентификаторов с:
select currval('"user"_id_seq');
которые, очевидно, потерпят неудачу. Это по крайней мере с Hibernate 5.2.13 и Spring Boot 2.0.0.RC1. Не нашли другого способа предотвратить это сообщение, поэтому теперь просто игнорируем его.
Проблема возникает из-за того, что вы не выбрали соответствующий JDBC. Просто загрузите и используйте JDBC для oracle 10g, а не 11g.
Как уже упоминалось в других комментариях, используя
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
Пока что похоже, что этот параметр не вызывает никаких проблем.
О, МОЙ БОГ! После многого, я получил решение этой проблемы. Я использую Hibernate-5 и postgress версии 10 и PGSimpleDataSource для источника данных. Нам нужно добавить свойства ниже в файл свойств hibernate.
Environment.NON_CONTEXTUAL_LOB_CREATION = "hibernate.jdbc.lob.non_contextual_creation" hibernateProp.put(Environment.NON_CONTEXTUAL_LOB_CREATION, true);
он решит все проблемы.
Я столкнулся с этой ошибкой, когда мое веб-приложение было запущено в Linux пользователем, вошедшим в систему с недостаточными правами доступа. Эта ошибка
org.hibernate.engine.jdbc.internal.LobCreatorBuilder - HHH000424: Отключение создания контекстного большого объекта как метода createClob() вызвало ошибку: java.lang.reflect.InvocationTargetException
обычно предшествуют другие ошибки/исключения, особенно с вашего сервера приложений, например, для Tomcat:
org.apache.catalina.LifecycleException: не удалось инициализировать компонент...
или же
java.lang.UnsatisfiedLinkError:... не может открыть общий объектный файл: нет такого файла или каталога
Решение:
Остановите текущий экземпляр вашего веб-приложения.
Войдите в систему как суперпользователь или пользователи с достаточными правами доступа, например root
Перезапустите веб-приложение или снова вызовите предыдущую функцию.
Для тех, кто сталкивается с этой проблемой в Spring Boot 2
по умолчанию при весенней загрузке использовалась версия hibernate 5.3.x, я добавил следующее свойство в свой pom.xml
<hibernate.version>5.4.2.Final</hibernate.version>
и ошибка исчезла. Причина ошибки уже объяснена в постах выше
Удалите @Temporal аннотации, если вы используете его с классами java.sql. *.
Проверьте, нет ли у вас VPN. У меня была такая же проблема, но я понял, что db я подключался к удаленному!
Hey имя свойства = "hibernate.temp.use_jdbc_metadata_defaults", изменяющееся на false, просто не отображает ошибку. Это не устраняет ошибку. Он просто скрывает ошибку.
Чтобы решить проблему, я попытался обновить версию спящего режима с гибернацией и mysql, но это бесполезно. Затем я проверил класс com.mysql.jdbc.Driver, в котором он указывает обратную совместимость для поддержки приложений, вызывающих Class.forName("com.mysql.jdbc.Driver");
, Загрузка класса com.mysql.jdbc.Driver'. This is deprecated. The new driver class is
com.mysql.jdbc.Driver'. This is deprecated. The new driver class is
com.mysql.jdbc.Driver'. This is deprecated. The new driver class is
com.mysql.cj.jdbc.Driver 'Затем я изменил "hibernate.connection.driver_class" на ошибку "com.mysql.cj.jdbc.Driver".
summary => используйте 'com.mysql.cj.jdbc.Driver' вместо 'com.mysql.jdbc.Driver' в свойстве 'hibernate.connection.driver_class'.