Lazy properties are not processed properly after a PreUpdate callback

Description

I have a blob field that don't want updated when I do a save on other fields in the table. Hibernate seems to be doing an areEqual check despite the fact that I've designated the field as updatable=false. Because the field is lazy loaded it's null and I get a ClassCastException when it does the areEqual check on save. Why is it doing a compare on that field when it's not updatable?

So my field is designated as such:

@Basic(fetch = FetchType.LAZY)
@Column(
insertable = true,
updatable = false,
name = "documentData"
)
@Lob private Blob documentData;
On org.springframework.data.repository.CrudRepository.save() I get the following error:

java.lang.ClassCastException: org.hibernate.bytecode.instrumentation.spi.LazyPropertyInitializer$1 cannot be cast to java.sql.Blob
at org.hibernate.type.descriptor.java.BlobTypeDescriptor.areEqual(BlobTypeDescriptor.java:45)
at org.hibernate.type.AbstractStandardBasicType.isEqual(AbstractStandardBasicType.java:196)
at org.hibernate.ejb.event.EJB3FlushEntityEventListener.copyState(EJB3FlushEntityEventListener.java:79)
at org.hibernate.ejb.event.EJB3FlushEntityEventListener.invokeInterceptor(EJB3FlushEntityEventListener.java:66)
at org.hibernate.event.internal.DefaultFlushEntityEventListener.handleInterception(DefaultFlushEntityEventListener.java:334)
at org.hibernate.event.internal.DefaultFlushEntityEventListener.scheduleUpdate(DefaultFlushEntityEventListener.java:285)
at org.hibernate.event.internal.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:164)
at org.hibernate.event.internal.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:225)
at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:99)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1214)
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:403)
at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175)
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:75)
at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:512)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:394)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:155)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.data.jpa.repository.support.LockModeRepositoryPostProcessor$LockModePopulatingMethodIntercceptor.invoke(LockModeRepositoryPostProcessor.java:91)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:90)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
at $Proxy216.save(Unknown Source)

Environment

Hibernate 4.1.6.Final
Spring
Oracle 11g

Activity

Show:
Gail Badner
October 20, 2015, 11:53 PM

Fixed in 4.2 branch.

Gail Badner
October 20, 2015, 11:53 PM

Reopening to add 4.2.21 as a fix version.

Gail Badner
July 29, 2015, 4:33 AM

Fixed in master and 4.3 branches.

Gail Badner
July 29, 2015, 4:33 AM

The fix for this jira only works when using the "old" byte code instrumentation.

There is a problem with EntityManager using the new enhancer in master branch. Another Jira will fix that issue.

Gail Badner
July 10, 2015, 11:55 PM

I've created a new pull request incorporating Martin Ball's commit with some small improvements: https://github.com/hibernate/hibernate-orm/pull/998

I'm not sure of the appropriate way to instrument classes in hibernate-entitymanager. I need to check on that before pushing this fix.

Fixed

Assignee

Gail Badner

Reporter

Todd Stanley

Fix versions

Labels

backPortable

None

Suitable for new contributors

None

Requires Release Note

None

Pull Request

None

backportDecision

None

Components

Affects versions

Priority

Major