当createClob()方法引发错误时,禁用上下文LOB创建


87

我正在将Hibernate 3.5.6与Oracle 10g一起使用。我在初始化期间看到以下异常,但应用程序本身运行正常。发生此异常的原因是什么?以及如何纠正?

异常
由于createClob()方法引发错误而禁用上下文LOB创建:java.lang.reflect.InvocationTargetException

信息
Oracle版本:Oracle数据库10g企业版10.2.0.4.0版JDBC驱动程序:Oracle JDBC驱动程序,版本:11.1.0.7.0


我想,只要您不尝试使用LOB,“应用程序本身就可以正常工作”。
Nyerguds 2015年

Answers:


76

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

对于Spring应用程序:

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

普通JPA:

hibernate.temp.use_jdbc_metadata_defaults=false

1
您尝试过哪个Java版本?Intellij无法找到此属性。
comiventor '17

我们尝试了Eclipse和Intellij。在这两种情况下,它的工作。实际上,我们对java 6,7,8感到厌倦,并且它对我们来说没有任何问题。只需调试您的代码或交叉检查您的代码。
Narayan Yerrabachu

67

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

hibernate.temp.use_jdbc_metadata_defaults false

1
谢谢帕特农。我知道可以禁用它的选项,但是我正在尝试查找此异常的原因。有指针吗?
GiriByaks 2011年

6
据我了解,这不是您的应用程序出现的问题,Hibernate只是在验证数据库是否支持某些功能,并在不支持的情况下进行自我调整。我会验证是否有任何映射正在触发此操作(例如LOB字段),但这没什么好担心的。
jpkrohling 2011年

5
警告:在Oracle中使用此解决方案很危险!这会导致意外的COMMIT。当hibernate创建临时表时,它必须打开一个新事务,因为Oracle DB中的DDL语句暗含了COMMIT。通过将此选项设置为false,可以禁用打开新事务,并且DDL在事务中将事务提交。
Boris Brodski

@BorisBrodski,您确定所描述的行为是由将此属性设置为false引起的吗?查看代码,如果这是错误的话,我看不到有任何额外的执行:github.com/hibernate/hibernate-orm/blob/…
jpkrohling 2014年

3
@jpkrohling是的,我调试了hibernate4.2.7,看看自己是否:设置useJdbcMetadatafalse禁止metaReportsDDLCausesTxnCommit设置,并保持falsegrepcode.com/file/repo1.maven.org/maven2/org.hibernate/...
鲍里斯Brodski

28

查看源代码中的评论:

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

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


5
是这个意思Driver does not support LOB feature还是Database does not support LOB feature
Marek Sebera

@MarekSebera驱动程序。我遇到这个问题是因为某些东西正在用古老的版本神秘地覆盖我的C3P0库。数据库支持它就好了。
Nyerguds 2015年

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
这是与史蒂夫·K(Steve K)相同的答案。为什么还要再次回答?
Bevor

4
@Bevor他解释了问题,但我给了答案。
UdayKiran Pulipati 2014年

2
您只想通过复制已经给出的答案来命令更新。您的答案与Steve K没有区别
。– Bevor

2
谢谢。基于此,我添加<property name="hibernate.temp.use_jdbc_metadata_defaults" value="false" />persistence.xml文件中,它为我解决了该问题。我在Hibernate中使用JPA。
dschulz

4
@对一个像我这样的新手来说老实说实话,这个答案在某种程度上我应该把它放在哪里很清楚
Anatoly Yakimchuk '16

14

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

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

摆脱该错误信息。效果相同,但没有“引发异常”详细信息。有关详细信息,请参见LobCreatorBuilder源。


在persistence.xml中进行设置
user961954,


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

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

select currval('"user"_id_seq');

这显然会失败。至少对于Hibernate 5.2.13和Spring Boot 2.0.0.RC1而言。还没有找到防止此消息的其他方法,因此现在忽略它。


2

使用Spring Boot 2.1.x时,在启动应用程序时会出现此警告消息。

如此处所示,也许此问题在较早版本中没有出现,因为默认情况下related属性设置为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模式下的异常跟踪确实很烦人!
DanielFernández

1

发生问题是因为您没有选择适当的JDBC。只需下载并使用针对oracle 10g(而非11g)的JDBC。


嗯 这与Boris Brodski的反应完全矛盾。您确定这有什么不同吗?
Nyerguds 2015年

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

当我的Web应用程序在Linux中由访问权限不足的用户登录时启动时,出现此错误。这个错误

org.hibernate.engine.jdbc.internal.LobCreatorBuilder-HHH000424:当createClob()方法引发错误时,禁用上下文LOB创建:java.lang.reflect.InvocationTargetException

通常在其他错误/异常之前,尤其是来自您的应用程序服务器(例如,对于Tomcat):

org.apache.catalina.LifecycleException:无法初始化组件...

要么

java.lang.UnsatisfiedLinkError:...无法打开共享库文件:没有这样的文件或目录

解:

  1. 停止您的Web应用程序当前实例。

  2. 以超级用户或具有足够访问权限的用户(即root)登录

  3. 重新启动您的Web应用程序或再次调用上一个功能。


0

对于任何使用Spring Boot 2面临此问题的人

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

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

错误消失了。错误原因已在上面的帖子中进行了解释



-3

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.