From d95ee3fc1f9cfc6bf23f19755feb6c43ab2b0783 Mon Sep 17 00:00:00 2001 From: Marco Belladelli Date: Wed, 17 Sep 2025 10:07:09 +0200 Subject: [PATCH] HHH-19784 Fix for package-private fields in same hierarchy using different class loaders --- .../internal/bytebuddy/EnhancerImpl.java | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/internal/bytebuddy/EnhancerImpl.java b/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/internal/bytebuddy/EnhancerImpl.java index 139de3f1b7e8..85212a079a3b 100644 --- a/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/internal/bytebuddy/EnhancerImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/internal/bytebuddy/EnhancerImpl.java @@ -794,8 +794,23 @@ String getDescriptor() { return fieldDescription.getDescriptor(); } - boolean isVisibleTo(TypeDescription typeDescription) { - return fieldDescription.isVisibleTo( typeDescription ); + boolean isVisibleTo(TypeDescription type) { + final var declaringType = fieldDescription.getDeclaringType().asErasure(); + if ( declaringType.isVisibleTo( type ) ) { + if ( fieldDescription.isPublic() || type.equals( declaringType ) ) { + return true; + } + else if ( fieldDescription.isProtected() ) { + return declaringType.isAssignableFrom( type ); + } + else if ( fieldDescription.isPrivate() ) { + return type.isNestMateOf( declaringType ); + } + // We explicitly consider package-private fields as not visible, as the classes + // might have the same package name but be loaded by different class loaders. + // (see https://hibernate.atlassian.net/browse/HHH-19784) + } + return false; } FieldDescription getFieldDescription() {