禁用上下文 LOB 创建作为 createClob() 方法引发错误

Posted

技术标签:

【中文标题】禁用上下文 LOB 创建作为 createClob() 方法引发错误【英文标题】:Disabling contextual LOB creation as createClob() method threw error 【发布时间】:2011-06-03 02:10:58 【问题描述】:

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

例外情况 禁用上下文 LOB 创建为 createClob() 方法引发错误:java.lang.reflect.InvocationTargetException

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

【问题讨论】:

“应用程序本身运行良好”...只要你不尝试使用 LOB,我想。 【参考方案1】:

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

对于 Spring 应用程序:

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

普通 JPA:

hibernate.temp.use_jdbc_metadata_defaults=false

【讨论】:

你用哪个java版本试过这个? Intellij 找不到此属性。 我们尝试了 eclipse 和 Intellij。在这两种情况下,它都可以正常工作。实际上,我们厌倦了 java 6、7,8,它的工作对我们来说没有任何问题。只需调试您的代码或交叉检查您的代码。【参考方案2】:

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

hibernate.temp.use_jdbc_metadata_defaults false

【讨论】:

谢谢帕特农。我知道禁用它的选项,但我正在尝试查找此异常的原因。有什么指点吗? 据我了解,这不是您的应用程序的问题,Hibernate 只是在验证数据库是否支持某些功能并在不支持的情况下自行调整。我会验证是否有任何映射触发了这一点(如 LOB 字段),但这没什么好担心的。 警告:在 Oracle 中使用这个解决方案是危险的!它会导致意外的提交。当 hibernate 创建临时表时,它必须打开一个新事务,因为 Oracle DB 中的 DDL 语句意味着 COMMIT。通过将此选项设置为 false,您将禁用打开新事务,并且 DDL 在您的事务中遇到问题 COMMITing 它。 @BorisBrodski ,您确定您描述的行为是由将此属性设置为 false 引起的吗?查看代码,当这是错误的时候,我看不到任何额外的执行:github.com/hibernate/hibernate-orm/blob/…。 @jpkrohling 是的,我调试了 hibernate4.2.7 并查看了自己是否:将 useJdbcMetadata 设置为 false 会阻止设置 metaReportsDDLCausesTxnCommit 并保持 false! grepcode.com/file/repo1.maven.org/maven2/org.hibernate/…【参考方案3】:

看source中的cmets:

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

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

【讨论】:

是指Driver does not support LOB feature还是Database does not support LOB feature @MarekSebera 司机。我遇到了这个问题,因为有些东西神秘地用一个古老的版本覆盖了我的 C3P0 库。数据库支持就好了。【参考方案4】:

为了隐藏异常:

对于 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

【讨论】:

【参考方案5】:

摆脱异常

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>

【讨论】:

这个答案和 Steve K 一样,你为什么又回答这个问题? @Bevor 他解释了问题,但我给出了答案。 您只想通过复制已经给出的答案来命令更新。您的回答与 Steve K 没有区别。 谢谢。基于此,我将&lt;property name="hibernate.temp.use_jdbc_metadata_defaults" value="false" /&gt; 添加到persistence.xml 文件中,它为我解决了这个问题。我在 Hibernate 中使用 JPA。 @Bevor 老实说,对于像我这样的新手,这个答案更清楚,部分我应该把这个属性放在哪里【参考方案6】:

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

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

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

【讨论】:

在 persistence.xml 中设置 你可以在那里设置,如果你使用例如spring 来设置 PU,你(可以)在 springs 配置空间中设置它 - 所以这取决于;)。【参考方案7】:

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

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

【讨论】:

【参考方案8】:

正如在其他 cmet 中提到的那样使用

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

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

【讨论】:

【参考方案9】:

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

您可以从这里下载:

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

不过需要免费注册。

【讨论】:

【参考方案10】:

如果你设置:

hibernate.temp.use_jdbc_metadata_defaults: false

当你的表名包含像用户这样的保留字时,它可能会给你带来麻烦。插入后它将尝试查找 id 序列:

select currval('"user"_id_seq');

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

【讨论】:

【参考方案11】:

使用 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

【讨论】:

谢谢。 log INFO 模式下的异常跟踪真的很烦人!【参考方案12】:

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

【讨论】:

嗯。这与 Boris Brodski 的反应完全矛盾。你确定这有什么不同吗?【参考方案13】:

我使用的是 hibernate 5.3.17,通过添加给定的属性它可以正常工作

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

谢谢

【讨论】:

【参考方案14】:

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

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

通常会出现其他错误/异常,尤其是来自您的应用程序服务器,即 对于 Tomcat:

org.apache.catalina.LifecycleException: 初始化组件失败...

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

解决方案:

    停止您的网络应用当前实例。

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

    重新启动您的网络应用或再次调用之前的函数。

【讨论】:

【参考方案15】:

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

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

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

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

【讨论】:

【参考方案16】:

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

【讨论】:

【参考方案17】:

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

【讨论】:

以上是关于禁用上下文 LOB 创建作为 createClob() 方法引发错误的主要内容,如果未能解决你的问题,请参考以下文章

已弃用的 Hibernate.createClob(Reader reader, int length) 的替代方法是啥

如何解决 org.postgresql.jdbc.PgConnection.createClob() 尚未实现

无法将大于 2000 字节的 LOB 作为缓冲消息排入 Oracle AQ

在不创建上下文的情况下禁用 Spring 和 Junit5 测试

创建表规范 lob 字段

HSQLDB:为现有数据库启用 LOB 压缩