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

时间:2011-01-03 22:00:17

标签: java hibernate oracle10g clob

我正在使用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

17 个答案:

答案 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:...无法打开共享对象文件:没有这样的文件或目录

解决方案:

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

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

  3. 重新启动您的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上。我有同样的问题,但意识到我正在连接到远程数据库!