Skip to content

Commit 1cd67d3

Browse files
dreab8sebersole
authored andcommitted
HHH-19220 ClassCastException: class org.hibernate.bytecode.enhance.spi.LazyPropertyInitializer cannot be cast to class java.lang.String
1 parent d02c69e commit 1cd67d3

File tree

1 file changed

+21
-0
lines changed

1 file changed

+21
-0
lines changed

hibernate-envers/src/main/java/org/hibernate/envers/event/spi/EnversPostUpdateEventListenerImpl.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
*/
77
package org.hibernate.envers.event.spi;
88

9+
import org.hibernate.bytecode.enhance.spi.LazyPropertyInitializer;
10+
import org.hibernate.bytecode.enhance.spi.interceptor.LazyAttributeLoadingInterceptor;
11+
import org.hibernate.bytecode.spi.BytecodeEnhancementMetadata;
912
import org.hibernate.envers.boot.internal.EnversService;
1013
import org.hibernate.envers.internal.synchronization.AuditProcess;
1114
import org.hibernate.envers.internal.synchronization.work.AuditWorkUnit;
@@ -73,12 +76,30 @@ private Object[] postUpdateDBState(PostUpdateEvent event) {
7376
final Object[] newDbState = event.getState().clone();
7477
if ( event.getOldState() != null ) {
7578
final EntityPersister entityPersister = event.getPersister();
79+
final Object entity = event.getEntity();
80+
final BytecodeEnhancementMetadata instrumentationMetadata = entityPersister.getInstrumentationMetadata();
81+
final LazyAttributeLoadingInterceptor lazyAttributeLoadingInterceptor;
82+
if ( instrumentationMetadata.isEnhancedForLazyLoading() ) {
83+
lazyAttributeLoadingInterceptor = instrumentationMetadata.extractInterceptor( entity );
84+
}
85+
else {
86+
lazyAttributeLoadingInterceptor = null;
87+
}
7688
for ( int i = 0; i < entityPersister.getPropertyNames().length; ++i ) {
7789
if ( !entityPersister.getPropertyUpdateability()[i] ) {
7890
// Assuming that PostUpdateEvent#getOldState() returns database state of the record before modification.
7991
// Otherwise, we would have to execute SQL query to be sure of @Column(updatable = false) column value.
8092
newDbState[i] = event.getOldState()[i];
8193
}
94+
// Properties that have not been initialized need to be fetched in order to bind their value in the
95+
// AUDIT insert statement.
96+
if ( newDbState[i] == LazyPropertyInitializer.UNFETCHED_PROPERTY ) {
97+
assert lazyAttributeLoadingInterceptor != null : "Entity:`" + entityPersister.getEntityName() + "` with uninitialized property:` " + entityPersister.getPropertyNames()[i] + "` hasn't an associated LazyAttributeLoadingInterceptor";
98+
event.getOldState()[i] = newDbState[i] = lazyAttributeLoadingInterceptor.fetchAttribute(
99+
entity,
100+
entityPersister.getPropertyNames()[i]
101+
);
102+
}
82103
}
83104
}
84105
return newDbState;

0 commit comments

Comments
 (0)