From d8ad674e7fe6278b451cc2c3dc4e9df60091f6e5 Mon Sep 17 00:00:00 2001 From: Andrea Boriero Date: Thu, 12 Sep 2024 11:57:24 +0200 Subject: [PATCH] HHH-18480 ClassCastException when updating a Blob with Oracle --- .../type/descriptor/java/BlobJavaType.java | 18 +++++++++--------- .../type/descriptor/java/ClobJavaType.java | 18 +++++++++--------- .../type/descriptor/java/NClobJavaType.java | 19 +++++++++---------- 3 files changed, 27 insertions(+), 28 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/BlobJavaType.java b/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/BlobJavaType.java index 57ee42fd64..1f5515a9dc 100644 --- a/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/BlobJavaType.java +++ b/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/BlobJavaType.java @@ -131,11 +131,8 @@ public class BlobJavaType extends AbstractClassJavaType { return (X) DataHelper.extractBytes( value.getBinaryStream() ); } } - else if (Blob.class.isAssignableFrom( type )) { - final Blob blob = value instanceof WrappedBlob - ? ( (WrappedBlob) value ).getWrappedBlob() - : getOrCreateBlob(value, options); - return (X) blob; + else if ( Blob.class.isAssignableFrom( type ) ) { + return (X) getOrCreateBlob( value, options ); } } catch ( SQLException e ) { @@ -146,13 +143,16 @@ public class BlobJavaType extends AbstractClassJavaType { } private Blob getOrCreateBlob(Blob value, WrapperOptions options) throws SQLException { - if(options.getDialect().useConnectionToCreateLob()) { - if(value.length() == 0) { + if ( value instanceof WrappedBlob ) { + value = ( (WrappedBlob) value ).getWrappedBlob(); + } + if ( options.getDialect().useConnectionToCreateLob() ) { + if ( value.length() == 0 ) { // empty Blob - return options.getLobCreator().createBlob(new byte[0]); + return options.getLobCreator().createBlob( new byte[0] ); } else { - return options.getLobCreator().createBlob(value.getBytes(1, (int) value.length())); + return options.getLobCreator().createBlob( value.getBytes( 1, (int) value.length() ) ); } } else { diff --git a/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/ClobJavaType.java b/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/ClobJavaType.java index a86bebe920..cce3fba31b 100644 --- a/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/ClobJavaType.java +++ b/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/ClobJavaType.java @@ -104,11 +104,8 @@ public class ClobJavaType extends AbstractClassJavaType { return (X) LobStreamDataHelper.extractString( value.getCharacterStream() ); } } - else if (Clob.class.isAssignableFrom( type )) { - final Clob clob = value instanceof WrappedClob - ? ( (WrappedClob) value ).getWrappedClob() - : getOrCreateClob(value, options); - return (X) clob; + else if ( Clob.class.isAssignableFrom( type ) ) { + return (X) getOrCreateClob( value, options ); } else if ( String.class.isAssignableFrom( type ) ) { if (value instanceof ClobImplementer) { @@ -129,13 +126,16 @@ public class ClobJavaType extends AbstractClassJavaType { } private Clob getOrCreateClob(Clob value, WrapperOptions options) throws SQLException { - if(options.getDialect().useConnectionToCreateLob()) { - if(value.length() == 0) { + if ( value instanceof WrappedClob ) { + value = ( (WrappedClob) value ).getWrappedClob(); + } + if ( options.getDialect().useConnectionToCreateLob() ) { + if ( value.length() == 0 ) { // empty Clob - return options.getLobCreator().createClob(""); + return options.getLobCreator().createClob( "" ); } else { - return options.getLobCreator().createClob(value.getSubString(1, (int) value.length())); + return options.getLobCreator().createClob( value.getSubString( 1, (int) value.length() ) ); } } else { diff --git a/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/NClobJavaType.java b/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/NClobJavaType.java index 48d4c9c2b6..4533df2e15 100644 --- a/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/NClobJavaType.java +++ b/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/NClobJavaType.java @@ -103,11 +103,8 @@ public class NClobJavaType extends AbstractClassJavaType { return (X) new CharacterStreamImpl( DataHelper.extractString( value.getCharacterStream() ) ); } } - else if (NClob.class.isAssignableFrom( type )) { - final NClob nclob = value instanceof WrappedNClob - ? ( (WrappedNClob) value ).getWrappedNClob() - : getOrCreateNClob(value, options); - return (X) nclob; + else if ( NClob.class.isAssignableFrom( type ) ) { + return (X) getOrCreateNClob( value, options ); } } catch ( SQLException e ) { @@ -118,13 +115,16 @@ public class NClobJavaType extends AbstractClassJavaType { } private NClob getOrCreateNClob(NClob value, WrapperOptions options) throws SQLException { - if(options.getDialect().useConnectionToCreateLob()) { - if(value.length() == 0) { + if ( value instanceof WrappedNClob ) { + value = ( (WrappedNClob) value ).getWrappedNClob(); + } + if ( options.getDialect().useConnectionToCreateLob() ) { + if ( value.length() == 0 ) { // empty NClob - return options.getLobCreator().createNClob(""); + return options.getLobCreator().createNClob( "" ); } else { - return options.getLobCreator().createNClob(value.getSubString(1, (int) value.length())); + return options.getLobCreator().createNClob( value.getSubString( 1, (int) value.length() ) ); } } else { @@ -132,7 +132,6 @@ public class NClobJavaType extends AbstractClassJavaType { } } - public NClob wrap(X value, WrapperOptions options) { if ( value == null ) { return null;