Skip to content

Commit 6bc23b8

Browse files
committed
HHH-19070 Introduce new single setPersistenceInfo method
1 parent 2b513e7 commit 6bc23b8

File tree

4 files changed

+47
-0
lines changed

4 files changed

+47
-0
lines changed

hibernate-core/src/main/java/org/hibernate/bytecode/enhance/internal/bytebuddy/CodeTemplates.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@
1919
import org.hibernate.bytecode.enhance.spi.interceptor.LazyAttributeLoadingInterceptor;
2020
import org.hibernate.collection.spi.PersistentCollection;
2121
import org.hibernate.engine.spi.CompositeOwner;
22+
import org.hibernate.engine.spi.EntityEntry;
2223
import org.hibernate.engine.spi.ExtendedSelfDirtinessTracker;
24+
import org.hibernate.engine.spi.ManagedEntity;
2325
import org.hibernate.engine.spi.PersistentAttributeInterceptor;
2426
import org.hibernate.internal.util.collections.ArrayHelper;
2527

@@ -37,6 +39,26 @@
3739

3840
class CodeTemplates {
3941

42+
static class SetPersistenceInfo {
43+
@Advice.OnMethodExit
44+
static void $$_hibernate_setOwner(
45+
@Advice.Argument(0) EntityEntry entityEntry,
46+
@Advice.Argument(1) ManagedEntity previous,
47+
@Advice.Argument(2) ManagedEntity next,
48+
@Advice.Argument(3) int instanceId,
49+
@Advice.Return(readOnly = false) EntityEntry previousEntry,
50+
@Advice.FieldValue(value = EnhancerConstants.ENTITY_ENTRY_FIELD_NAME, readOnly = false) EntityEntry entityEntryField,
51+
@Advice.FieldValue(value = EnhancerConstants.PREVIOUS_FIELD_NAME, readOnly = false) ManagedEntity previousField,
52+
@Advice.FieldValue(value = EnhancerConstants.NEXT_FIELD_NAME, readOnly = false) ManagedEntity nextField,
53+
@Advice.FieldValue(value = EnhancerConstants.INSTANCE_ID_FIELD_NAME, readOnly = false) int instanceIdField) {
54+
previousEntry = entityEntryField;
55+
entityEntryField = entityEntry;
56+
previousField = previous;
57+
nextField = next;
58+
instanceIdField = instanceId;
59+
}
60+
}
61+
4062
static class SetOwner {
4163
@Advice.OnMethodEnter
4264
static void $$_hibernate_setOwner(

hibernate-core/src/main/java/org/hibernate/bytecode/enhance/internal/bytebuddy/EnhancerImpl.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,13 @@ private DynamicType.Builder<?> doEnhance(Supplier<DynamicType.Builder<?>> builde
245245
EnhancerConstants.INSTANCE_ID_SETTER_NAME
246246
);
247247

248+
builder = addSetPersistenceInfoMethod(
249+
builder,
250+
constants.TypeEntityEntry,
251+
constants.TypeManagedEntity,
252+
constants.TypeIntegerPrimitive
253+
);
254+
248255
builder = addInterceptorHandling( builder, managedCtClass );
249256

250257
if ( enhancementContext.doDirtyCheckingInline( managedCtClass ) ) {
@@ -704,6 +711,19 @@ private DynamicType.Builder<?> addFieldWithGetterAndSetter(
704711
.intercept( FieldAccessor.ofField( fieldName ) );
705712
}
706713

714+
private DynamicType.Builder<?> addSetPersistenceInfoMethod(
715+
DynamicType.Builder<?> builder,
716+
TypeDefinition entityEntryType,
717+
TypeDefinition managedEntityType,
718+
TypeDefinition intType) {
719+
return builder
720+
// returns previous entity entry
721+
.defineMethod( EnhancerConstants.PERSISTENCE_INFO_SETTER_NAME, entityEntryType, constants.methodModifierPUBLIC )
722+
// previous, next, instance-id
723+
.withParameters( entityEntryType, managedEntityType, managedEntityType, intType )
724+
.intercept( constants.implementationSetPersistenceInfo );
725+
}
726+
707727
private List<AnnotatedFieldDescription> collectCollectionFields(TypeDescription managedCtClass) {
708728
List<AnnotatedFieldDescription> collectionList = new ArrayList<>();
709729

hibernate-core/src/main/java/org/hibernate/bytecode/enhance/internal/bytebuddy/EnhancerImplConstants.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ public final class EnhancerImplConstants {
5151
final Advice adviceInitializeLazyAttributeLoadingInterceptor;
5252
final Implementation implementationSetOwner;
5353
final Implementation implementationClearOwner;
54+
final Implementation implementationSetPersistenceInfo;
5455

5556
//Frequently used Modifiers:
5657
final int methodModifierPUBLIC = ModifierContributor.Resolver.of( List.of( Visibility.PUBLIC ) ).resolve();
@@ -119,6 +120,8 @@ public EnhancerImplConstants() {
119120
.wrap( StubMethod.INSTANCE );
120121
this.implementationClearOwner = Advice.to( CodeTemplates.ClearOwner.class, adviceLocator )
121122
.wrap( StubMethod.INSTANCE );
123+
this.implementationSetPersistenceInfo = Advice.to( CodeTemplates.SetPersistenceInfo.class, adviceLocator )
124+
.wrap( StubMethod.INSTANCE );
122125
}
123126

124127
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,8 @@ public final class EnhancerConstants {
188188
public static final String INSTANCE_ID_GETTER_NAME = "$$_hibernate_getInstanceId";
189189
public static final String INSTANCE_ID_SETTER_NAME = "$$_hibernate_setInstanceId";
190190

191+
public static final String PERSISTENCE_INFO_SETTER_NAME = "$$_hibernate_setPersistenceInfo";
192+
191193

192194
private EnhancerConstants() {
193195
}

0 commit comments

Comments
 (0)