我正在将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
我正在将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
Answers:
通过在下面添加属性来禁用此警告。
对于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
useJdbcMetadata
为false
禁止metaReportsDDLCausesTxnCommit
设置,并保持false
!grepcode.com/file/repo1.maven.org/maven2/org.hibernate/...
查看源代码中的评论:
基本上,这里我们只是简单地检查是否可以调用JDBC 4中添加的用于LOB创建的java.sql.Connection方法。我们不仅检查java.sql.Connection是否声明了这些方法,还检查了实际的java.sql.Connection。实例实现它们(即,可以在不简单引发异常的情况下调用它们)。
因此,它正在尝试确定是否可以使用一些新的JDBC 4方法。我猜您的驱动程序可能不支持新的LOB创建方法。
Driver does not support LOB feature
还是Database does not support LOB feature
?
为了隐藏异常:
对于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
摆脱异常
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>
<property name="hibernate.temp.use_jdbc_metadata_defaults" value="false" />
到persistence.xml
文件中,它为我解决了该问题。我在Hibernate中使用JPA。
使用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
如其他评论所述
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
到目前为止,看起来该设置不会引起任何问题。
将JDBC驱动程序更新到最新版本可以消除讨厌的错误消息。
你可以在这里下载:
http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html
但是需要免费注册。
使用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
发生问题是因为您没有选择适当的JDBC。只需下载并使用针对oracle 10g(而非11g)的JDBC。
当我的Web应用程序在Linux中由访问权限不足的用户登录时启动时,出现此错误。这个错误
org.hibernate.engine.jdbc.internal.LobCreatorBuilder-HHH000424:当createClob()方法引发错误时,禁用上下文LOB创建:java.lang.reflect.InvocationTargetException
通常在其他错误/异常之前,尤其是来自您的应用程序服务器(例如,对于Tomcat):
org.apache.catalina.LifecycleException:无法初始化组件...
要么
java.lang.UnsatisfiedLinkError:...无法打开共享库文件:没有这样的文件或目录
解:
停止您的Web应用程序当前实例。
以超级用户或具有足够访问权限的用户(即root)登录
重新启动您的Web应用程序或再次调用上一个功能。
对于任何使用Spring Boot 2面临此问题的人
默认情况下,春季引导使用的是hibernate 5.3.x版本,我在pom.xml中添加了以下属性
<hibernate.version>5.4.2.Final</hibernate.version>
错误消失了。错误原因已在上面的帖子中进行了解释
如果将@Temporal注释与java.sql。*类一起使用,请删除它。
检查您是否不在VPN上。我有同样的问题,但是意识到我正在连接到远程数据库!