87

我正在使用带有 Oracle 10g 的 Hibernate 3.5.6。我在初始化期间看到以下异常,但应用程序本身工作正常。这个异常的原因是什么?以及如何纠正?

异常
禁用上下文 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

4

17 回答 17

78

通过在下面添加属性来禁用此警告。

对于 Spring 应用程序:

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

普通 JPA:

hibernate.temp.use_jdbc_metadata_defaults=false
于 2017-02-28T12:33:41.587 回答
67

正如您所注意到的,此异常并不是真正的问题。它发生在引导期间,当 Hibernate 尝试从数据库中检索一些元信息时。如果这让您烦恼,您可以禁用它:

hibernate.temp.use_jdbc_metadata_defaults false
于 2011-01-04T11:01:20.347 回答
28

查看源代码中的评论:

基本上这里我们只是检查是否可以调用 JDBC 4 中添加的用于创建 LOB 的 java.sql.Connection 方法。我们不仅检查 java.sql.Connection 是否声明了这些方法,还检查实际的 java.sql.Connection 是否实例实现它们(即可以在不简单地抛出异常的情况下调用)。

因此,它试图确定它是否可以使用一些新的 JDBC 4 方法。我猜您的驱动程序可能不支持新的 LOB 创建方法。

于 2011-01-04T13:52:36.227 回答
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
于 2018-02-05T13:38:21.690 回答
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>
于 2014-04-09T08:24:38.570 回答
14

使用 Hibernate 4.3.x / 5.0.x 对此进行更新 - 您可以将此属性设置为 true:

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

摆脱该错误消息。效果相同,但没有“抛出异常”细节。有关详细信息,请参阅 LobCreatorBuilder 源代码。

于 2015-12-15T12:15:08.817 回答
10

只需在 application.properties 中添加以下行

spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults: false
于 2018-06-08T07:50:03.013 回答
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

到目前为止,这个设置似乎没有引起任何问题。

于 2019-05-22T12:00:42.823 回答
4

将 JDBC 驱动程序更新到最新版本删除了讨厌的错误消息。

你可以在这里下载:

http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html

不过需要免费注册。

于 2014-04-04T14:44:26.470 回答
4

如果你设置:

hibernate.temp.use_jdbc_metadata_defaults: false

当您的表名包含保留字如用户时,它可能会给您带来 PostgreSQL 的麻烦。插入后,它将尝试使用以下命令查找 id 序列:

select currval('"user"_id_seq');

这显然会失败。至少在 Hibernate 5.2.13 和 Spring Boot 2.0.0.RC1 中是这样。还没有找到其他方法来阻止此消息,所以现在忽略它。

于 2018-02-14T13:15:05.197 回答
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
于 2019-12-07T15:15:36.427 回答
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

谢谢

于 2020-10-05T07:39:19.570 回答
1

出现问题是因为您没有选择合适的 JDBC。只需下载并使用适用于 oracle 10g 而不是 11g 的 JDBC。

于 2015-10-09T20:12:02.190 回答
0

对于任何遇到 Spring Boot 2 问题的人

默认情况下,spring boot 使用的是 hibernate 5.3.x 版本,我在 pom.xml 中添加了以下属性

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

并且错误消失了。错误原因已在上面的帖子中解释过

于 2019-09-30T10:51:20.820 回答
0

当我的 Web 应用程序在 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. 重新启动您的网络应用程序或再次调用以前的函数。

于 2019-01-04T03:05:28.820 回答
-1

如果将 @Temporal 注释与 java.sql.* 类一起使用,请删除它。

于 2016-02-26T04:30:34.273 回答
-3

检查您是否不在VPN上。我有同样的问题,但意识到我正在连接到远程的数据库!

于 2015-03-24T19:10:45.970 回答