我正在使用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
答案 0 :(得分:61)
正如您所注意到的,这个例外并不是一个真正的问题。它发生在启动期间,当Hibernate尝试从数据库中检索一些元信息时。如果这让您烦恼,可以禁用它:
hibernate.temp.use_jdbc_metadata_defaults false
答案 1 :(得分:53)
通过添加下面的属性来禁用此警告。
对于Spring应用程序:
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false
普通JPA:
hibernate.temp.use_jdbc_metadata_defaults=false
答案 2 :(得分:24)
查看source中的评论:
基本上我们只是在检查 我们是否可以打电话给 用于LOB的java.sql.Connection方法 JDBC中添加的创建4.我们不仅如此 检查是否有java.sql.Connection 声明这些方法,但也 是否是实际的java.sql.Connection 实例实现它们(即可以 没有简单地扔一个叫 除外)。
因此,它正在尝试确定它是否可以使用一些新的JDBC 4方法。我猜你的驱动程序可能不支持新的LOB创建方法。
答案 3 :(得分:22)
摆脱异常
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>
答案 4 :(得分:20)
为了隐藏异常:
对于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 :(得分:12)
使用Hibernate 4.3.x / 5.0.x更新为此 - 您可以将此属性设置为true:
<prop key="hibernate.jdbc.lob.non_contextual_creation">true</prop>
删除该错误消息。同样的效果,但没有&#34;抛出异常&#34;详情。 有关详细信息,请参阅LobCreatorBuilder源。
答案 6 :(得分:6)
只需在application.properties
中添加以下行spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults: false
答案 7 :(得分:4)
将JDBC驱动程序更新到最新版本删除了令人讨厌的错误消息。
您可以从这里下载:
http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html
虽然需要免费注册。
答案 8 :(得分:3)
如果你设置:
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有关。 Haven没有找到其他方法来阻止这个消息所以现在只是忽略它。
答案 9 :(得分:1)
出现问题是因为您未选择适当的JDBC。只需下载并使用JDBC for Oracle 10g而不是11g。
答案 10 :(得分:1)
如其他评论中所述
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
到目前为止,看来此设置不会引起任何问题。
答案 11 :(得分:1)
我正在使用休眠5.3.17,并且通过添加给定的属性可以正常工作
hibernate.default_entity_mode=dynamic-map
hibernate.temp.use_jdbc_metadata_defaults=true
hibernate.jdbc.lob.non_contextual_creation = true
谢谢
答案 12 :(得分:0)
当我的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应用程序或再次调用上一个功能。
答案 13 :(得分:0)
面向任何使用Spring Boot 2遇到此问题的人
默认情况下,春季引导使用的是hibernate 5.3.x版本,我在pom.xml中添加了以下属性
#include <stdio.h>
#include <stdlib.h>
void find_largest_smallest(int a[], int n, int *largest, int *smallest)
{
largest=smallest=a[0];
int i;
for(i=0; i<n; i++)
{
if (largest<a[i])
largest=a[i];
}
for(i=0; i<n; i++)
{
//printf("%d\n", a[i]);
if (smallest>a[i])
smallest=a[i];
}
printf("Largest is %d\n", largest);
printf("smallest is %d\n", smallest);
}
int main()
{
int elem;
int i;
int *x;
int *y;
printf("How many elements you want to store ?:");
scanf("%d", &elem);
int store[elem];
for(i=0; i<elem; i++)
{
printf("Enter a value to be stored:");
scanf("%d", &store[i]);
}
find_largest_smallest(store, elem, &x, &y);
printf("Largest value stored is %d and the smallest is %d.", *x, y);
return 0;
}
,错误消失了。错误的原因已经在上面的帖子中解释了
答案 14 :(得分:0)
在使用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
答案 15 :(得分:-1)
如果将其与java.sql。*类一起使用,请删除@Temporal注释。
答案 16 :(得分:-2)
检查您是否不在VPN上。我有同样的问题,但意识到我正在连接到远程数据库!