Merging a blob on an entity results in a class cast exception

Description

Merging an entity with a blob results in a class cast exception:

java.lang.ClassCastException: org.hibernate.bytecode.enhance.spi.LazyPropertyInitializer$1 cannot be cast to java.sql.Blob at org.hibernate.type.BlobType.getReplacement(BlobType.java:20) at org.hibernate.type.AbstractStandardBasicType.replace(AbstractStandardBasicType.java:354) at org.hibernate.type.TypeHelper.replace(TypeHelper.java:160) at org.hibernate.event.internal.DefaultMergeEventListener.copyValues(DefaultMergeEventListener.java:394) at org.hibernate.event.internal.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:328) at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:170) at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:69) at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:884) at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:870) at org.hibernate.bugs.ORMUnitTestCase.hhh12555Test(ORMUnitTestCase.java:84) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.hibernate.testing.junit4.ExtendedFrameworkMethod.invokeExplosively(ExtendedFrameworkMethod.java:45) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) at org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:298) at org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:292) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.lang.Thread.run(Thread.java:748)

Test case: https://github.com/nikowitt/hibernate-test-case-templates/tree/HHH-12555

Activity

Show:

Ka Wu March 25, 2021 at 12:24 PM

The Hibernate release page for 5.2 hasn’t been updated to 5.2.18.Final ever since. Should be updated soon. See https://discourse.hibernate.org/t/backporting-hhh-12555-to-5-2/5213. Sorry for the inconvenience.

Ka Wu March 25, 2021 at 8:33 AM

Sorry, https://hibernate.atlassian.net/browse/HHH-12633 seems to be the backport for 5.2.18, as its been tagged that way.

New question: when will Hibernate 5.2.18 be released, given that the last one was created 2018-04-26…?

Ka Wu March 25, 2021 at 5:47 AM

Ugh. We just ran into this in a WebLogic 12c, Java EE 7 environment:

Caused by: java.lang.ClassCastException: org.hibernate.bytecode.enhance.spi.LazyPropertyInitializer$1 cannot be cast to [B at org.hibernate.type.descriptor.java.PrimitiveByteArrayTypeDescriptor.areEqual(PrimitiveByteArrayTypeDescriptor.java:26) at org.hibernate.type.AbstractStandardBasicType.isEqual(AbstractStandardBasicType.java:198) at org.hibernate.type.AbstractStandardBasicType.isSame(AbstractStandardBasicType.java:186) at org.hibernate.type.AbstractStandardBasicType.isDirty(AbstractStandardBasicType.java:229) at org.hibernate.type.AbstractStandardBasicType.isDirty(AbstractStandardBasicType.java:225) at org.hibernate.type.TypeHelper.findDirty(TypeHelper.java:305) at org.hibernate.persister.entity.AbstractEntityPersister.findDirty(AbstractEntityPersister.java:4256) at org.hibernate.event.internal.DefaultFlushEntityEventListener.dirtyCheck(DefaultFlushEntityEventListener.java:538) at org.hibernate.event.internal.DefaultFlushEntityEventListener.isUpdateNecessary(DefaultFlushEntityEventListener.java:215) at org.hibernate.event.internal.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:142) at org.hibernate.event.internal.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:216) at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:85) at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:38) at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1437) at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1423) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at weblogic.persistence.BasePersistenceContextProxyImpl.invoke(BasePersistenceContextProxyImpl.java:97) at weblogic.persistence.TransactionalEntityManagerProxyImpl.invoke(TransactionalEntityManagerProxyImpl.java:164) at weblogic.persistence.BasePersistenceContextProxyImpl.invoke(BasePersistenceContextProxyImpl.java:86) at com.sun.proxy.$Proxy289.flush(Unknown Source) at de.itzbund.riko.plattform.core.base.dao.GenericDaoImpl.update(GenericDaoImpl.java:74) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.bea.core.repackaged.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:310) at com.bea.core.repackaged.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182) at com.bea.core.repackaged.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149) at com.oracle.pitchfork.intercept.MethodInvocationInvocationContext.proceed(MethodInvocationInvocationContext.java:101) at com.oracle.pitchfork.intercept.JeeInterceptorInterceptor.invoke(JeeInterceptorInterceptor.java:101) at com.bea.core.repackaged.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) at com.oracle.pitchfork.intercept.MethodInvocationInvocationContext.proceed(MethodInvocationInvocationContext.java:101) at org.jboss.weld.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:64) at org.jboss.weld.ejb.SessionBeanInterceptor.aroundInvoke(SessionBeanInterceptor.java:52) at sun.reflect.GeneratedMethodAccessor180.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.oracle.pitchfork.intercept.JeeInterceptorInterceptor.invoke(JeeInterceptorInterceptor.java:94) at com.bea.core.repackaged.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) at com.bea.core.repackaged.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131) at com.bea.core.repackaged.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119) at com.bea.core.repackaged.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) at com.bea.core.repackaged.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) at com.sun.proxy.$Proxy301.update(Unknown Source) at de.itzbund.riko.plattform.core.see.dao.SchiffDaoImpl_ax9uw0_NoIntfViewImpl.__WL_invoke(Unknown Source) at weblogic.ejb.container.internal.SessionLocalMethodInvoker.invoke(SessionLocalMethodInvoker.java:33) ... 114 more

We’re using 5.2.17, the latest and greatest Hibernate for this setup, but this fix is not in there and really forces us to use two entities for all cases where we have images/documents stored as byte[] + lazy loading. This makes several things much more complicated than they’d have to be.

5.2.17 is from 2018-04-26 and this issue was submitted 2 weeks after that release.

Any chance to get this backported to 5.2, even after so many years? (there’s absolutely no way to upgrade the server…)

Former user December 18, 2018 at 5:31 PM

Pushed to 5.3 branch as well.

Guillaume Smet November 29, 2018 at 10:13 AM

I integrated the original test in the PR here: https://github.com/hibernate/hibernate-orm/pull/2390

We need to decide if we still want to keep the UNFETCHED_PROPERTY code in the types or get rid of it and use the other approach (or both).

Fixed

Details

Assignee

Reporter

Fix versions

Affects versions

Priority

Created May 9, 2018 at 10:44 AM
Updated March 25, 2021 at 12:24 PM
Resolved December 18, 2018 at 5:31 PM