禁用上下文 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 没有区别。 谢谢。基于此,我将<property name="hibernate.temp.use_jdbc_metadata_defaults" value="false" />
添加到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