การปิดใช้งานการสร้าง LOB ตามบริบทเนื่องจากเมธอด createClob () ส่งข้อผิดพลาด


87

ฉันใช้ Hibernate 3.5.6 กับ Oracle 10g ฉันเห็นข้อยกเว้นด้านล่างระหว่างการเริ่มต้น แต่แอปพลิเคชันนั้นทำงานได้ดี สาเหตุของข้อยกเว้นนี้คืออะไร? และจะแก้ไขได้อย่างไร?

ข้อยกเว้น
การปิดใช้งานการสร้าง 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


"แอปพลิเคชันทำงานได้ดี" ... ตราบใดที่คุณไม่ได้ลองใช้ LOBs ฉันคิดว่า
Nyerguds

คำตอบ:


76

ปิดคำเตือนนี้โดยเพิ่มคุณสมบัติด้านล่าง

สำหรับการใช้งาน Spring:

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

JPA ปกติ:

hibernate.temp.use_jdbc_metadata_defaults=false

1
คุณลองใช้ Java เวอร์ชันใด Intellij ไม่พบคุณสมบัตินี้
comiventor

เราลองใช้ eclipse และ Intellij ในทั้งสองกรณีมันใช้งานได้จริงเราเหนื่อยกับ java 6, 7,8 และมันทำงานได้โดยไม่มีปัญหาสำหรับเรา เพียงแค่แก้ปัญหารหัสของคุณหรือตรวจสอบรหัสของคุณ
Narayan Yerrabachu

67

ดังที่คุณสังเกตเห็นข้อยกเว้นนี้ไม่ใช่ปัญหาที่แท้จริง เกิดขึ้นระหว่างการบูตเมื่อ Hibernate พยายามดึงข้อมูลเมตาจากฐานข้อมูล หากสิ่งนี้ทำให้คุณรำคาญคุณสามารถปิดการใช้งานได้:

hibernate.temp.use_jdbc_metadata_defaults false

1
ขอบคุณ Partenon ฉันทราบถึงตัวเลือกในการปิดใช้งาน แต่ฉันกำลังพยายามหาสาเหตุของข้อยกเว้นนี้ คำแนะนำใด ๆ
GiriByaks

6
เท่าที่ฉันเข้าใจมันไม่ใช่ปัญหากับแอปพลิเคชันของคุณ Hibernate กำลังตรวจสอบว่า DB รองรับคุณสมบัติบางอย่างหรือไม่และปรับตัวเองในกรณีที่ไม่เป็นเช่นนั้น ฉันจะตรวจสอบว่าการแมปใด ๆ ทำให้เกิดสิ่งนี้หรือไม่ (เช่นฟิลด์ LOB) แต่ก็ไม่มีอะไรต้องกังวล
jpkrohling

5
คำเตือน : การใช้โซลูชันนี้กับ Oracle เป็นอันตราย ! มันนำไปสู่การกระทำที่ไม่คาดคิด เมื่อไฮเบอร์เนตสร้างตารางชั่วคราวจะต้องเปิดธุรกรรมใหม่เนื่องจากคำสั่ง DDL ใน Oracle DB บ่งบอกถึง COMMIT ด้วยการตั้งค่าตัวเลือกนี้เป็นเท็จคุณจะปิดใช้งานการเปิดธุรกรรมใหม่และ DDL จะได้รับปัญหาภายในธุรกรรมของคุณที่ยอมรับ
Boris Brodski

@BorisBrodski คุณแน่ใจหรือไม่ว่าพฤติกรรมที่คุณอธิบายนั้นเกิดจากการตั้งค่าคุณสมบัตินี้เป็นเท็จ มองไปที่รหัสที่ฉันไม่เห็นอะไรพิเศษถูกประหารชีวิตเมื่อนี้เป็นเท็จ: github.com/hibernate/hibernate-orm/blob/...
jpkrohling

3
@jpkrohling ใช่ฉันดีบั๊ก hibernate4.2.7 และเห็นว่าตัวเอง: การตั้งค่าuseJdbcMetadataเพื่อfalseป้องกันไม่metaReportsDDLCausesTxnCommitให้ตั้งค่าและมันยังคงอยู่false! grepcode.com/file/repo1.maven.org/maven2/org.hibernate/…
Boris Brodski

28

ดูความคิดเห็นในแหล่งที่มา :

โดยทั่วไปที่นี่เรากำลังตรวจสอบว่าเราสามารถเรียกวิธีการ java.sql.Connection สำหรับการสร้าง LOB ที่เพิ่มใน JDBC 4 ได้หรือไม่เราไม่เพียงตรวจสอบว่า 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

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. ทำไมคุณตอบอีกครั้ง
Bevor

4
@Bevor เขาอธิบายปัญหา แต่ฉันให้คำตอบ
UdayKiran Pulipati

2
คุณต้องการสั่งการอัปเดตโดยการคัดลอกคำตอบที่ให้ไว้แล้วเท่านั้น คำตอบของคุณไม่ได้แตกต่างจาก Steve K.
Bevor

2
ขอบคุณ. จากนี้ผมเพิ่ม<property name="hibernate.temp.use_jdbc_metadata_defaults" value="false" /> ไปยังpersistence.xmlไฟล์และแก้ไขปัญหาสำหรับผม ฉันใช้ JPA กับ Hibernate
dschulz

4
@Bevor จะซื่อสัตย์สำหรับมือใหม่อย่างฉันคำตอบนี้ชัดเจนกว่ามากในส่วนที่ฉันควรวางคุณสมบัตินี้
Anatoly Yakimchuk

14

อัปเดตเป็นสิ่งนี้สำหรับการใช้ Hibernate 4.3.x / 5.0.x - คุณสามารถตั้งค่าคุณสมบัตินี้เป็น true:

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

เพื่อกำจัดข้อความแสดงข้อผิดพลาดนั้น เอฟเฟกต์เดียวกัน แต่ไม่มีรายละเอียด "ข้อยกเว้นการโยน" ดูแหล่งที่มาของ LobCreatorBuilder สำหรับรายละเอียด


ตั้งค่านี้ใน persistence.xml
user961954


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

การอัพเดตไดรเวอร์ JDBC เป็นเวอร์ชันล่าสุดจะลบข้อความแสดงข้อผิดพลาดที่น่ารังเกียจ

คุณสามารถดาวน์โหลดได้จากที่นี่:

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

ต้องลงทะเบียนฟรี


4

หากคุณตั้งค่า:

hibernate.temp.use_jdbc_metadata_defaults: false

อาจทำให้คุณมีปัญหากับ PostgreSQL เมื่อชื่อตารางของคุณมีคำสงวนเช่นผู้ใช้ หลังจากใส่แล้วจะพยายามค้นหาลำดับรหัสด้วย:

select currval('"user"_id_seq');

ซึ่งจะล้มเหลวอย่างเห็นได้ชัด อย่างน้อยก็มี Hibernate 5.2.13 และ Spring Boot 2.0.0.RC1 ไม่พบวิธีอื่นในการป้องกันข้อความนี้ดังนั้นตอนนี้เพียงแค่เพิกเฉย


2

เมื่อทำงานกับ Spring boot 2.1.x ข้อความเตือนนี้จะปรากฏขึ้นเมื่อเริ่มต้นแอปพลิเคชัน

ตามที่ระบุไว้ที่นี่ปัญหานี้อาจไม่ปรากฏในเวอร์ชันก่อนหน้าเนื่องจากคุณสมบัติที่เกี่ยวข้องถูกตั้งค่าเป็น true ตามค่าเริ่มต้นและตอนนี้เป็นเท็จ:

https://github.com/spring-projects/spring-boot/issues/12007

ดังนั้นการแก้ปัญหานี้ทำได้ง่ายเพียงแค่เพิ่มคุณสมบัติต่อไปนี้ในไฟล์ spring application.property

spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation = true

ขอบคุณสำหรับสิ่งนี้. การติดตามข้อยกเว้นในโหมดบันทึกข้อมูลน่ารำคาญจริงๆ!
Daniel Fernández

1

ปัญหาเกิดขึ้นเนื่องจากคุณไม่ได้เลือก JDBC ที่เหมาะสม เพียงดาวน์โหลดและใช้ JDBC สำหรับ oracle 10g แทนที่จะเป็น 11g


ฮะ. สิ่งนี้ขัดแย้งกับการตอบสนองของ 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: การปิดใช้งานการสร้าง LOB ตามบริบทเป็นวิธี createClob () ส่งข้อผิดพลาด: java.lang.reflect.InvocationTargetException

มักจะนำหน้าด้วยข้อผิดพลาด / ข้อยกเว้นอื่น ๆ โดยเฉพาะจากแอปพลิเคชันเซิร์ฟเวอร์ของคุณเช่นสำหรับ Tomcat:

org.apache.catalina.LifecycleException: ล้มเหลวในการเริ่มต้นคอมโพเนนต์ ...

หรือ

java.lang.UnsantediedLinkError: ... ไม่สามารถเปิดไฟล์อ็อบเจ็กต์ที่แบ่งใช้: ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว

วิธีการแก้:

  1. หยุดอินสแตนซ์ปัจจุบันของเว็บแอปของคุณ

  2. เข้าสู่ระบบด้วยผู้ใช้ขั้นสูงหรือผู้ที่มีสิทธิ์การเข้าถึงเพียงพอเช่น root

  3. รีสตาร์ทเว็บแอปของคุณหรือเรียกใช้ฟังก์ชันก่อนหน้าอีกครั้ง


0

สำหรับใครที่กำลังเจอปัญหา Spring Boot 2 อยู่นี้

โดยค่าเริ่มต้นสปริงบูตใช้เวอร์ชัน hibernate 5.3.x ฉันได้เพิ่มคุณสมบัติต่อไปนี้ใน pom.xml ของฉัน

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

และข้อผิดพลาดหายไป เหตุผลของข้อผิดพลาดได้อธิบายไว้แล้วในโพสต์ด้านบน



-3

ตรวจสอบว่าคุณไม่ได้ใช้ VPN หรือไม่ ฉันมีปัญหาเดียวกัน แต่ตระหนักดีว่าฉันกำลังเชื่อมต่อกับรีโมต!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.