createClob () 메서드로 인해 컨텍스트 LOB 생성을 비활성화하면 오류가 발생했습니다.


87

Oracle 10g와 함께 Hibernate 3.5.6을 사용하고 있습니다. 초기화 중에 아래 예외가 표시되지만 응용 프로그램 자체가 제대로 작동합니다. 이 예외의 원인은 무엇입니까? 어떻게 수정할 수 있습니까?

예외
상황 별 LOB 생성 비활성화 createClob()메서드로 인해 오류가 발생했습니다.java.lang.reflect.InvocationTargetException

정보
Oracle 버전 : Oracle Database 10g Enterprise Edition 릴리스 10.2.0.4.0 JDBC 드라이버 : Oracle JDBC 드라이버, 버전 : 11.1.0.7.0


"응용 프로그램 자체가 잘 작동합니다."... LOB를 사용하지 않는 한 저는 상상합니다.
Nyerguds 2015

답변:


76

아래에 속성을 추가하여이 경고를 비활성화하십시오.

Spring 애플리케이션의 경우 :

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

일반 JPA :

hibernate.temp.use_jdbc_metadata_defaults=false

1
어떤 Java 버전을 사용해 보셨습니까? Intellij가이 속성을 찾을 수 없습니다.
comiventor

우리는 Intellij뿐만 아니라 eclipse로 시도했습니다. 두 경우 모두 작동합니다. 실제로 우리는 Java 6, 7,8에 지쳤으며 문제없이 작동합니다. 코드를 디버그하거나 코드를 교차 확인하십시오.
Narayan Yerrabachu

67

아시다시피이 예외는 실제 문제가 아닙니다. Hibernate가 데이터베이스에서 일부 메타 정보를 검색하려고 할 때 부팅 중에 발생합니다. 이것이 귀찮다면 비활성화 할 수 있습니다.

hibernate.temp.use_jdbc_metadata_defaults false

1
감사합니다 파르테논. 비활성화하는 옵션을 알고 있지만이 예외의 원인을 찾으려고합니다. 포인터가 있습니까?
GiriByaks 2011 년

6
내가 이해하는 한, 그것은 당신의 응용 프로그램에 문제가 아닙니다. Hibernate는 DB가 일부 기능을 지원하는지 확인하고 그렇지 않은 경우 자체 조정합니다. LOB 필드와 같은 매핑이이를 트리거하는지 확인하지만 걱정할 필요가 없습니다.
jpkrohling 2011 년

5
경고 : Oracle과 함께이 솔루션을 사용하는 것은 위험합니다 ! 그것은 리드 예상치 못한 확약 . Hibernate가 임시 테이블을 생성 할 때 Oracle DB의 DDL 문은 COMMIT를 의미하므로 새 트랜잭션을 열어야합니다. 이 옵션을 false로 설정하면 새 트랜잭션 열기를 비활성화하고 DDL이 트랜잭션 내에서 문제를 가져옵니다.
Boris Brodski 2014

@BorisBrodski, 설명하신 동작이이 속성을 false로 설정하여 발생한 것이 확실합니까? 코드를 살펴보면 이것이 거짓 일 때 추가로 실행되는 것이 보이지 않습니다 : github.com/hibernate/hibernate-orm/blob/… .
jpkrohling 2014

3
@jpkrohling 예, hibernate4.2.7을 디버깅하고 제 자신이 다음과 같은지 확인했습니다. 설정 useJdbcMetadatafalse방지 metaReportsDDLCausesTxnCommit하도록 설정하고 유지됩니다 false! grepcode.com/file/repo1.maven.org/maven2/org.hibernate/…
Boris Brodski 2014

28

소스 의 주석을 살펴보면 :

기본적으로 여기서는 JDBC 4에 추가 된 LOB 생성을 위해 java.sql.Connection 메소드를 호출 할 수 있는지 확인하고 있습니다. java.sql.Connection이 이러한 메소드를 선언하는지 여부뿐만 아니라 실제 java.sql.Connection이 있는지 여부도 확인합니다. 인스턴스가이를 구현합니다 (예 : 단순히 예외를 던지지 않고 호출 될 수 있음).

그래서 새로운 JDBC 4 메소드를 사용할 수 있는지 확인하려고합니다. 드라이버가 새로운 LOB 생성 방법을 지원하지 않을 수 있습니다.


5
그게 Driver does not support LOB feature아니면 Database does not support LOB feature?
Marek Sebera

@MarekSebera 드라이버. 이 문제는 무언가가 내 C3P0 라이브러리를 고대 버전으로 이상하게 덮어 쓰고 있기 때문에 발생합니다. 데이터베이스는 잘 지원합니다.
Nyerguds 2015

24

예외를 숨기려면 :

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

21

예외를 제거하려면

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>

5
이것은 Steve K의 대답과 같습니다. 왜 다시 대답합니까?
필요입니다

4
@ Bevor 그가 문제를 설명하지만 나는 대답을 주었다.
UdayKiran Pulipati

2
이미 주어진 답변을 복사하여 업데이트를 명령하고 싶습니다. 스티브 K. 구별하지 않습니다 대답
필요입니다

2
감사. 이를 바탕으로, 나는 추가 <property name="hibernate.temp.use_jdbc_metadata_defaults" value="false" /> 받는 persistence.xml파일과 나를 위해 문제를 해결했다. Hibernate와 함께 JPA를 사용합니다.
dschulz

4
@Bevor 내가이 속성을 넣어야이 답변이 부분에 더 명확 나 같은 초보자를위한 정직합니다
아나톨리 Yakimchuk

14

Hibernate 4.3.x / 5.0.x를 사용하기 위해 이것을 업데이트하십시오-이 속성을 true로 설정할 수 있습니다 :

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

해당 오류 메시지를 제거합니다. 동일한 효과이지만 "예외 발생"세부 사항이 없습니다. 자세한 내용은 LobCreatorBuilder 소스를 참조하세요.


persistence.xml에서 설정
user961954

10

application.properties에 아래 줄을 추가하십시오.

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

6

다른 의견에서 언급했듯이

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

지금까지는이 설정이 문제를 일으키지 않는 것 같습니다.



4

설정하는 경우 :

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에서. 이 메시지를 방지하는 다른 방법을 찾지 못 했으므로 이제 무시하십시오.


2

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

감사합니다. 로그 INFO 모드의 예외 추적은 정말 짜증납니다!
Daniel Fernández

1

적절한 JDBC를 선택하지 않았기 때문에 문제가 발생합니다. 11g가 아닌 Oracle 10g 용 JDBC를 다운로드하여 사용하십시오.


허. 이것은 Boris Brodski의 반응과 완전히 모순됩니다. 이것이 어떤 차이를 만드는 것이 확실합니까?
Nyerguds

1

최대 절전 모드 5.3.17을 사용하고 있으며 주어진 속성을 추가하여 제대로 작동합니다.

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

감사


0

불충분 한 액세스 권한으로 로그인 한 사용자가 Linux에서 웹 앱을 시작했을 때이 오류가 발생했습니다. 이 오류

org.hibernate.engine.jdbc.internal.LobCreatorBuilder-HHH000424 : createClob () 메소드로 컨텍스트 LOB 생성을 비활성화하면 오류가 발생했습니다. java.lang.reflect.InvocationTargetException

일반적으로 다른 오류 / 예외, 특히 응용 프로그램 서버 (예 : Tomcat의 경우)에서 발생합니다.

org.apache.catalina.LifecycleException : 구성 요소를 초기화하지 못했습니다 ...

또는

java.lang.UnsatisfiedLinkError : ... 공유 객체 파일을 열 수 없습니다 : 해당 파일 또는 디렉토리가 없습니다.

해결책:

  1. 웹앱 현재 인스턴스를 중지합니다.

  2. 수퍼 유저 또는 충분한 액세스 권한이있는 사용자 (예 : 루트)로 로그인합니다.

  3. 웹 앱을 다시 시작하거나 이전 기능을 다시 호출하십시오.


0

Spring Boot 2에서이 문제에 직면 한 모든 사람을 위해

기본적으로 봄 부팅은 최대 절전 모드 5.3.x 버전을 사용하고 있었고 pom.xml에 다음 속성을 추가했습니다.

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

오류가 사라졌습니다. 오류 이유는 이미 위의 게시물에 설명되어 있습니다.


-1

java.sql. * 클래스와 함께 사용하는 경우 @Temporal 주석을 제거하십시오.


-3

VPN을 사용하고 있지 않은지 확인하십시오. 나는 같은 문제가 있었지만 내가 원격에 연결하고 있다는 것을 깨달았습니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.