Vô hiệu hóa tạo LOB theo ngữ cảnh do lỗi phương thức createClob ()


87

Tôi đang sử dụng Hibernate 3.5.6 với Oracle 10g. Tôi thấy ngoại lệ bên dưới trong quá trình khởi tạo nhưng bản thân ứng dụng đang hoạt động tốt. Nguyên nhân của ngoại lệ này là gì? và làm thế nào nó có thể được sửa chữa?

Ngoại lệ
Tắt tạo LOB theo ngữ cảnh dưới dạngcreateClob() phương thức bị lỗi:java.lang.reflect.InvocationTargetException

Thông tin
Phiên bản Oracle: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 Trình điều khiển JDBC: Trình điều khiển Oracle JDBC, phiên bản: 11.1.0.7.0


"Bản thân ứng dụng đang hoạt động tốt" ... miễn là bạn không thử sử dụng LOB, tôi tưởng tượng.
Nyerguds

Câu trả lời:


76

Tắt cảnh báo này bằng cách thêm thuộc tính bên dưới.

Đối với ứng dụng mùa xuân:

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

JPA bình thường:

hibernate.temp.use_jdbc_metadata_defaults=false

1
Bạn đã thử phiên bản java này với? Intellij không thể tìm thấy thuộc tính này.
comiventor

Chúng tôi đã thử với eclipse cũng như Intellij. Trong cả hai trường hợp, nó hoạt động. Thực tế, chúng tôi mệt mỏi với java 6, 7,8 và nó hoạt động mà không có vấn đề gì đối với chúng tôi. Chỉ cần gỡ lỗi mã của bạn hoặc kiểm tra chéo mã của bạn.
Narayan Yerrabachu

67

Như bạn đã nhận thấy, ngoại lệ này không phải là một vấn đề thực sự. Nó xảy ra trong quá trình khởi động, khi Hibernate cố gắng lấy một số thông tin meta từ cơ sở dữ liệu. Nếu điều này làm phiền bạn, bạn có thể tắt nó:

hibernate.temp.use_jdbc_metadata_defaults false

1
Cảm ơn Partenon. Tôi biết tùy chọn vô hiệu hóa nó, nhưng tôi đang cố gắng tìm lý do cho ngoại lệ này. Bất kỳ gợi ý?
GiriByaks

6
Theo như tôi hiểu thì ứng dụng của bạn không có vấn đề gì cả, Hibernate chỉ đang xác minh xem DB có hỗ trợ một số tính năng hay không và tự điều chỉnh trong trường hợp không. Tôi sẽ xác minh xem có bất kỳ ánh xạ nào đang kích hoạt điều này không (như trường LOB), nhưng không có gì phải lo lắng.
jpkrohling

5
CẢNH BÁO : Sử dụng giải pháp này với Oracle là rất nguy hiểm ! Nó dẫn đến những CAM KẾT bất ngờ . Khi hibernate tạo các bảng tạm thời, nó phải mở một giao dịch mới, vì các câu lệnh DDL trong Oracle DB ngụ ý COMMIT. Bằng cách đặt tùy chọn này thành false, bạn sẽ vô hiệu hóa việc mở giao dịch mới và DDL gặp sự cố trong giao dịch của bạn. CAM KẾT giao dịch đó.
Boris Brodski

@BorisBrodski, bạn có chắc chắn hành vi mà bạn mô tả là do đặt thuộc tính này thành false không? Nhìn vào mã, tôi không thấy bất kỳ điều gì bổ sung được thực thi khi điều này là sai: github.com/hibernate/hibernate-orm/blob/… .
jpkrohling

3
@jpkrohling Có, tôi đã gỡ lỗi hibernate4.2.7 và tự xem: Cài đặt useJdbcMetadatađể falsengăn chặn metaReportsDDLCausesTxnCommitđược đặt và nó vẫn ở false! grepcode.com/file/repo1.maven.org/maven2/org.hibernate/…
Boris Brodski

28

Nhìn vào các bình luận trong nguồn :

Về cơ bản ở đây chúng tôi chỉ đơn giản là kiểm tra xem chúng tôi có thể gọi các phương thức java.sql.Connection để tạo LOB được thêm vào JDBC 4. Chúng tôi không chỉ kiểm tra xem java.sql.Connection có khai báo các phương thức này hay không mà còn xem liệu java.sql.Connection thực sự instance thực hiện chúng (nghĩa là có thể được gọi mà không chỉ đơn giản là ném một ngoại lệ).

Vì vậy, nó đang cố gắng xác định xem nó có thể sử dụng một số phương pháp JDBC 4 mới hay không. Tôi đoán trình điều khiển của bạn có thể không hỗ trợ phương pháp tạo LOB mới.


5
Nó có nghĩa là Driver does not support LOB featurehay Database does not support LOB feature?
Marek Sebera

Trình điều khiển @MarekSebera. Tôi đang gặp sự cố này vì có thứ gì đó đang ghi đè một cách bí ẩn thư viện C3P0 của tôi bằng một phiên bản cổ. Cơ sở dữ liệu hỗ trợ nó tốt.
Nyerguds

24

Để ẩn ngoại lệ:

Đối với Hibernate 5.2 (và Spring Boot 2.0), bạn có thể sử dụng thuộc tính use_jdbc_metadata_defaults mà những người khác đã chỉ ra:

# Meant to hide HHH000424: Disabling contextual LOB creation as createClob() method threw error 
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults: false

Hoặc, nếu bạn muốn không có bất kỳ tác dụng phụ nào từ cài đặt trên (có một nhận xét cảnh báo chúng tôi về một số tác dụng phụ của Oracle, tôi không biết nó có hợp lệ hay không), bạn có thể vô hiệu hóa ghi nhật ký của ngoại lệ như thế này :

logging:
   level: 
      # Hides HHH000424: Disabling contextual LOB creation as createClob() method threw error 
      org.hibernate.engine.jdbc.env.internal.LobCreatorBuilderImpl: WARN

21

Để thoát khỏi ngoại lệ

INFO - HHH000424: Disabling contextual LOB creation as createClob() method threw error :java.lang.reflect.InvocationTargetException

Trong hibernate.cfg.xmltệp Thêm thuộc tính bên dưới

<property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>

5
Đây là câu trả lời giống như từ Steve K. Tại sao bạn trả lời lại?
Bevor

4
@Bevor anh ấy giải thích vấn đề nhưng tôi đã trả lời.
UdayKiran Pulipati

2
Bạn chỉ muốn ra lệnh cập nhật bằng cách sao chép một câu trả lời đã cho sẵn. Câu trả lời của bạn không phân biệt được từ Steve K.
Bevor

2
Cảm ơn. Dựa trên điều này, tôi đã thêm <property name="hibernate.temp.use_jdbc_metadata_defaults" value="false" /> vào persistence.xmltập tin và nó giải quyết vấn đề này đối với tôi. Tôi sử dụng JPA với Hibernate.
dschulz

4
@Bevor phải trung thực cho một người mới như tôi câu trả lời này là rõ ràng hơn nhiều trong phần nơi tôi nên đặt khách sạn này
Anatoly Yakimchuk

14

Cập nhật lên này để sử dụng Hibernate 4.3.x / 5.0.x - bạn chỉ có thể đặt thuộc tính này thành true:

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

để loại bỏ thông báo lỗi đó. Hiệu ứng tương tự nhưng không có chi tiết "ngoại lệ đã ném". Xem nguồn LobCreatorBuilder để biết thêm chi tiết.


đặt điều này trong
Persence.xml

10

Chỉ cần thêm dòng dưới đây trong application.properties

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

6

Như đã đề cập trong các bình luận khác bằng cách sử dụng

hibernate.temp.use_jdbc_metadata_defaults = false

... sẽ khắc phục được thông báo khó chịu, nhưng có thể dẫn đến nhiều vấn đề đáng ngạc nhiên khác. Giải pháp tốt hơn chỉ là vô hiệu hóa tạo LOB theo ngữ cảnh với điều này:

hibernate.jdbc.lob.non_contextual_creation = true

Điều này sẽ khiến Hibernate (trong trường hợp của tôi là 5.3.10.Final) bỏ qua việc thăm dò trình điều khiển JDBC và chỉ xuất ra thông báo sau:

HHH000421: Disabling contextual LOB creation as hibernate.jdbc.lob.non_contextual_creation is true

Cho đến nay, có vẻ như cài đặt này không gây ra bất kỳ sự cố nào.



4

Nếu bạn đặt:

hibernate.temp.use_jdbc_metadata_defaults: false

nó có thể khiến bạn gặp rắc rối với PostgreSQL khi tên bảng của bạn chứa từ dành riêng như người dùng. Sau khi chèn, nó sẽ cố gắng tìm chuỗi id với:

select currval('"user"_id_seq');

mà rõ ràng sẽ thất bại. Điều này ít nhất là với Hibernate 5.2.13 và Spring Boot 2.0.0.RC1. Chưa tìm ra cách khác để ngăn thông báo này nên bây giờ chỉ cần bỏ qua nó.


2

Khi làm việc với Spring boot 2.1.x, thông báo cảnh báo này xuất hiện khi khởi động ứng dụng.

Như đã chỉ ra ở đây, có thể sự cố này không xuất hiện trong các phiên bản trước vì thuộc tính liên quan được đặt thành true theo mặc định và bây giờ nó là false:

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

Do đó, việc giải quyết vấn đề này đơn giản bằng cách thêm thuộc tính sau vào tệp spring application.property.

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

Cám ơn vì cái này. Một dấu vết ngoại lệ trong chế độ INFO nhật ký thực sự khó chịu!
Daniel Fernández

1

Sự cố xảy ra do bạn không chọn JDBC thích hợp. Chỉ cần tải xuống và sử dụng JDBC cho oracle 10g thay vì 11g.


Huh. Điều này hoàn toàn trái ngược với phản ứng của Boris Brodski. Bạn có chắc điều này tạo ra bất kỳ sự khác biệt nào không?
Nyerguds

1

Tôi đang sử dụng hibernate 5.3.17 và nó hoạt động tốt bằng cách thêm các thuộc tính đã cho

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

Cảm ơn


0

Tôi gặp lỗi này khi ứng dụng web của tôi được khởi động trong Linux bởi người dùng đăng nhập không đủ quyền truy cập. Lỗi này

org.hibernate.engine.jdbc.internal.LobCreatorBuilder - HHH000424: Vô hiệu hóa tạo LOB theo ngữ cảnh khi phương thức createClob () đã gây ra lỗi: java.lang.reflect.InvocationTargetException

thường xảy ra trước các lỗi / ngoại lệ khác, đặc biệt là từ máy chủ ứng dụng của bạn, tức là đối với Tomcat:

org.apache.catalina.LifecycleException: Không thể khởi tạo thành phần ...

hoặc là

java.lang.UnsatisfiedLinkError: ... không thể mở tệp đối tượng được chia sẻ: Không có tệp hoặc thư mục như vậy

Giải pháp:

  1. Dừng ứng dụng web của bạn phiên bản hiện tại.

  2. Đăng nhập với siêu người dùng hoặc những người có đủ quyền truy cập tức là root

  3. Khởi động lại ứng dụng web của bạn hoặc gọi lại chức năng trước đó.


0

Đối với bất kỳ ai đang gặp phải vấn đề này với Spring Boot 2

theo mặc định khởi động mùa xuân đang sử dụng phiên bản 5.3.x hibernate, tôi đã thêm thuộc tính sau vào pom.xml của mình

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

và lỗi đã biến mất. Lý do cho lỗi đã được giải thích trong các bài viết ở trên


-1

Loại bỏ chú thích @Temporal nếu bạn sử dụng nó với các lớp java.sql. *.


-3

Kiểm tra xem bạn có đang sử dụng VPN không. Tôi đã gặp vấn đề tương tự nhưng nhận ra db tôi đang kết nối với điều khiển từ xa!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.