Skip to content

Commit 709be42

Browse files
committed
HHH-19050 Allow configuration of EntityManagerFactoryBuilderImpl to override the BytecodeProvider instance
1 parent 5285c3f commit 709be42

File tree

4 files changed

+38
-1
lines changed

4 files changed

+38
-1
lines changed

hibernate-core/src/main/java/org/hibernate/bytecode/enhance/spi/EnhancementContext.java

+13
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
*/
55
package org.hibernate.bytecode.enhance.spi;
66

7+
import org.hibernate.bytecode.spi.BytecodeProvider;
8+
79
import jakarta.persistence.metamodel.Type;
810
import org.hibernate.Incubating;
911

@@ -156,4 +158,15 @@ public interface EnhancementContext {
156158
default UnsupportedEnhancementStrategy getUnsupportedEnhancementStrategy() {
157159
return UnsupportedEnhancementStrategy.SKIP;
158160
}
161+
162+
/**
163+
* Allows to force the use of a specific instance of BytecodeProvider to perform the enhancement.
164+
* @return When returning {code null} the default implementation will be used. Only return a different instance if
165+
* you need to override the default implementation.
166+
*/
167+
@Incubating
168+
default BytecodeProvider getBytecodeProvider() {
169+
return null;
170+
}
171+
159172
}

hibernate-core/src/main/java/org/hibernate/cfg/BytecodeSettings.java

+11
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,17 @@ public interface BytecodeSettings {
2626
@Deprecated( forRemoval = true )
2727
String BYTECODE_PROVIDER = "hibernate.bytecode.provider";
2828

29+
/**
30+
* This is similar to the now deprecated legacy property {@code hibernate.bytecode.provider} except
31+
* it's used specifically to pass an existing instance of a {@link org.hibernate.bytecode.spi.BytecodeProvider};
32+
* this happens to also allow to override the implementation, but is primarily intended to allow reusing a
33+
* specific instance; this could be useful when the implementation benefits from internal caches.
34+
* When not set, Hibernate will create its default implementation.
35+
*
36+
* @settingDefault {@code null}
37+
*/
38+
String BYTECODE_PROVIDER_INSTANCE = "hibernate.enhancer.bytecodeprovider.instance";
39+
2940
/**
3041
* Enable association management feature in runtime bytecode enhancement
3142
*

hibernate-core/src/main/java/org/hibernate/jpa/boot/internal/EntityManagerFactoryBuilderImpl.java

+12
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
import org.hibernate.bytecode.enhance.spi.EnhancementException;
5353
import org.hibernate.bytecode.enhance.spi.UnloadedClass;
5454
import org.hibernate.bytecode.enhance.spi.UnloadedField;
55+
import org.hibernate.bytecode.spi.BytecodeProvider;
5556
import org.hibernate.bytecode.spi.ClassTransformer;
5657
import org.hibernate.cfg.AvailableSettings;
5758
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
@@ -113,6 +114,7 @@
113114
import static org.hibernate.cfg.AvailableSettings.TRANSACTION_COORDINATOR_STRATEGY;
114115
import static org.hibernate.cfg.AvailableSettings.URL;
115116
import static org.hibernate.cfg.AvailableSettings.USER;
117+
import static org.hibernate.cfg.BytecodeSettings.BYTECODE_PROVIDER_INSTANCE;
116118
import static org.hibernate.cfg.BytecodeSettings.ENHANCER_ENABLE_ASSOCIATION_MANAGEMENT;
117119
import static org.hibernate.cfg.BytecodeSettings.ENHANCER_ENABLE_DIRTY_TRACKING;
118120
import static org.hibernate.cfg.BytecodeSettings.ENHANCER_ENABLE_LAZY_INITIALIZATION;
@@ -422,6 +424,11 @@ protected EnhancementContext getEnhancementContext(
422424
final boolean dirtyTrackingEnabled,
423425
final boolean lazyInitializationEnabled,
424426
final boolean associationManagementEnabled ) {
427+
final Object propValue = configurationValues.get( BYTECODE_PROVIDER_INSTANCE );
428+
if ( propValue != null && ( ! ( propValue instanceof BytecodeProvider ) ) ) {
429+
throw new PersistenceException( "Property " + BYTECODE_PROVIDER_INSTANCE + " was set to '" + propValue + "', which is not compatible with the expected type " + BytecodeProvider.class );
430+
}
431+
final BytecodeProvider overriddenBytecodeProvider = (BytecodeProvider) propValue;
425432
return new DefaultEnhancementContext() {
426433

427434
@Override
@@ -461,6 +468,11 @@ public boolean doExtendedEnhancement(UnloadedClass classDescriptor) {
461468
// doesn't make any sense to have extended enhancement enabled at runtime. we only enhance entities anyway.
462469
return false;
463470
}
471+
472+
@Override
473+
public BytecodeProvider getBytecodeProvider() {
474+
return overriddenBytecodeProvider;
475+
}
464476
};
465477
}
466478

hibernate-core/src/main/java/org/hibernate/jpa/internal/enhance/EnhancingClassTransformerImpl.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ public class EnhancingClassTransformerImpl implements ClassTransformer {
3333
public EnhancingClassTransformerImpl(EnhancementContext enhancementContext) {
3434
Objects.requireNonNull( enhancementContext );
3535
this.enhancementContext = enhancementContext;
36-
this.bytecodeProvider = BytecodeProviderInitiator.buildDefaultBytecodeProvider();
36+
final BytecodeProvider overriddenProvider = enhancementContext.getBytecodeProvider();
37+
this.bytecodeProvider = overriddenProvider == null ? BytecodeProviderInitiator.buildDefaultBytecodeProvider() : overriddenProvider;
3738
}
3839

3940
@Override

0 commit comments

Comments
 (0)