Skip to content

Commit 99a95f7

Browse files
committed
HHH-19220 ClassCastException: class org.hibernate.bytecode.enhance.spi.LazyPropertyInitializer cannot be cast to class java.lang.String
1 parent 8e1dbbc commit 99a95f7

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
@@ -4,6 +4,9 @@
44
*/
55
package org.hibernate.envers.event.spi;
66

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

0 commit comments

Comments
 (0)