2012-09-05 22 views
2

我有一個blob字段,當我在表中的其他字段上進行保存時,不希望更新的blob字段。儘管我已經將字段指定爲updatable = false,但Hibernate似乎正在執行areEqual檢查。由於該字段是惰性加載,因此它爲空,並且在保存時執行areEqual檢查時,我得到一個ClassCastException。當它不可更新時,爲什麼它會在該字段上進行比較?爲什麼hibernate在域updatable = false時執行isEqual

所以我的字段指定爲:

@Basic(fetch = FetchType.LAZY) 
@Column(
    insertable = true, 
    updatable = false, 
    name = "documentData" 
) 
@Lob private Blob documentData; 

在org.springframework.data.repository.CrudRepository.save()我收到以下錯誤:

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) 

回答

0

可以使​​方法,這將是更新之前加載惰性加載字段

@PreUpdate 
    private void loadField() 
    { 
    getDocumentData(); 
    } 
+0

我想我可以做一些像tha t來強制它加載,但那樣會打破延遲加載的目的。如果沒有必要,我不希望它加載,在這種情況下它應該是。 –

相關問題