Skip to content

Commit 5ad5d42

Browse files
committed
more minor cleanups in EntityBinder
and stricter enforcement of @DiscriminatorValue requirement (I don't think this is a substantive change to behavior, but it might be).
1 parent 7eb1110 commit 5ad5d42

File tree

1 file changed

+29
-33
lines changed

1 file changed

+29
-33
lines changed

hibernate-core/src/main/java/org/hibernate/boot/model/internal/EntityBinder.java

Lines changed: 29 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -521,9 +521,9 @@ private boolean mapAsIdClass(
521521
}
522522

523523
private ClassDetails idClassDetails(InheritanceState inheritanceState, ClassDetails classWithIdClass) {
524-
final var idClassAnn = classWithIdClass.getDirectAnnotationUsage( IdClass.class );
524+
final var idClass = classWithIdClass.getDirectAnnotationUsage( IdClass.class );
525525
final var classDetailsRegistry = modelsContext().getClassDetailsRegistry();
526-
if ( idClassAnn == null ) {
526+
if ( idClass == null ) {
527527
try {
528528
// look for an Id class generated by Hibernate Processor as an inner class of static metamodel
529529
final var javaClass = inheritanceState.getClassDetails().toJavaClass();
@@ -535,7 +535,7 @@ private ClassDetails idClassDetails(InheritanceState inheritanceState, ClassDeta
535535
}
536536
}
537537
else {
538-
return classDetailsRegistry.resolveClassDetails( idClassAnn.value().getName() );
538+
return classDetailsRegistry.resolveClassDetails( idClass.value().getName() );
539539
}
540540
}
541541

@@ -1030,7 +1030,7 @@ private boolean useDiscriminatorColumnForJoined(DiscriminatorColumn discriminato
10301030
if ( ignore ) {
10311031
if ( log.isTraceEnabled() ) {
10321032
log.trace( "Ignoring explicit @DiscriminatorColumn annotation on: "
1033-
+ annotatedClass.getName() );
1033+
+ annotatedClass.getName() );
10341034
}
10351035
}
10361036
return !ignore;
@@ -1057,7 +1057,7 @@ private void processIdPropertiesIfNotAlready(
10571057
Map<ClassDetails, InheritanceState> inheritanceStates) {
10581058
final Set<String> missingIdProperties = new HashSet<>( idPropertiesIfIdClass );
10591059
final Set<String> missingEntityProperties = new HashSet<>();
1060-
for ( PropertyData propertyAnnotatedElement : elementsToProcess.getElements() ) {
1060+
for ( var propertyAnnotatedElement : elementsToProcess.getElements() ) {
10611061
final String propertyName = propertyAnnotatedElement.getPropertyName();
10621062
if ( !idPropertiesIfIdClass.contains( propertyName ) ) {
10631063
final var memberDetails = propertyAnnotatedElement.getAttributeMember();
@@ -1224,28 +1224,25 @@ public boolean isPropertyDefinedInSuperHierarchy(String name) {
12241224
}
12251225

12261226
private void bindRowManagement() {
1227-
final var ontext = modelsContext();
1228-
final var dynamicInsertAnn = annotatedClass.getAnnotationUsage( DynamicInsert.class, ontext );
1229-
persistentClass.setDynamicInsert( dynamicInsertAnn != null );
1230-
1231-
final var dynamicUpdateAnn = annotatedClass.getAnnotationUsage( DynamicUpdate.class, ontext );
1232-
persistentClass.setDynamicUpdate( dynamicUpdateAnn != null );
1227+
final var modelsContext = modelsContext();
1228+
final var dynamicInsert = annotatedClass.hasAnnotationUsage( DynamicInsert.class, modelsContext );
1229+
final var dynamicUpdate = annotatedClass.hasAnnotationUsage( DynamicUpdate.class, modelsContext );
1230+
persistentClass.setDynamicInsert( dynamicInsert );
1231+
persistentClass.setDynamicUpdate( dynamicUpdate );
12331232

1234-
if ( persistentClass.useDynamicInsert()
1235-
&& annotatedClass.hasAnnotationUsage( SQLInsert.class, ontext ) ) {
1233+
if ( dynamicInsert && annotatedClass.hasAnnotationUsage( SQLInsert.class, modelsContext ) ) {
12361234
throw new AnnotationException( "Entity '" + name + "' is annotated both '@DynamicInsert' and '@SQLInsert'" );
12371235
}
1238-
if ( persistentClass.useDynamicUpdate()
1239-
&& annotatedClass.hasAnnotationUsage( SQLUpdate.class, ontext ) ) {
1236+
if ( dynamicUpdate && annotatedClass.hasAnnotationUsage( SQLUpdate.class, modelsContext ) ) {
12401237
throw new AnnotationException( "Entity '" + name + "' is annotated both '@DynamicUpdate' and '@SQLUpdate'" );
12411238
}
12421239
}
12431240

12441241
private void bindOptimisticLocking() {
1245-
final var optimisticLockingAnn = annotatedClass.getAnnotationUsage( OptimisticLocking.class, modelsContext() );
1246-
persistentClass.setOptimisticLockStyle( fromLockType( optimisticLockingAnn == null
1242+
final var optimisticLocking = annotatedClass.getAnnotationUsage( OptimisticLocking.class, modelsContext() );
1243+
persistentClass.setOptimisticLockStyle( fromLockType( optimisticLocking == null
12471244
? OptimisticLockType.VERSION
1248-
: optimisticLockingAnn.type() ) );
1245+
: optimisticLocking.type() ) );
12491246
}
12501247

12511248
private void bindEntityAnnotation() {
@@ -1560,27 +1557,26 @@ private NamedEntityGraphDefinition namedEntityGraphDefinition(org.hibernate.anno
15601557

15611558
private void bindDiscriminatorValue() {
15621559
final var discriminatorValue = annotatedClass.getAnnotationUsage( DiscriminatorValue.class, modelsContext() );
1560+
persistentClass.setDiscriminatorValue( discriminatorValueString( discriminatorValue ) );
1561+
}
1562+
1563+
private String discriminatorValueString(DiscriminatorValue discriminatorValue) {
15631564
if ( discriminatorValue == null ) {
1564-
final Value discriminator = persistentClass.getDiscriminator();
1565+
final var discriminator = persistentClass.getDiscriminator();
15651566
if ( discriminator == null ) {
1566-
persistentClass.setDiscriminatorValue( name );
1567+
return name;
15671568
}
15681569
else {
1569-
switch ( discriminator.getType().getName() ) {
1570-
case "character":
1571-
throw new AnnotationException( "Entity '" + name
1572-
+ "' has a discriminator of character type and must specify its '@DiscriminatorValue'" );
1573-
case "integer":
1574-
// TODO: pretty nasty, should we just deprecate/disallow this?
1575-
persistentClass.setDiscriminatorValue( String.valueOf( name.hashCode() ) );
1576-
break;
1577-
default:
1578-
persistentClass.setDiscriminatorValue( name ); //Spec compliant
1579-
}
1570+
final String discriminatorTypeName = discriminator.getType().getName();
1571+
return switch ( discriminatorTypeName ) {
1572+
case "string" -> name; //Spec compliant
1573+
case "integer"-> String.valueOf( name.hashCode() ); // TODO: pretty nasty, should we just deprecate/disallow this?
1574+
default -> throw new MappingException( "Entity '" + name + "' must explicitly specify its '@DiscriminatorValue'" );
1575+
};
15801576
}
15811577
}
15821578
else {
1583-
persistentClass.setDiscriminatorValue( discriminatorValue.value() );
1579+
return discriminatorValue.value();
15841580
}
15851581
}
15861582

@@ -1665,7 +1661,7 @@ private void bindSubclassCache() {
16651661
+" (only root classes may define second-level caching semantics)");
16661662
}
16671663

1668-
final Cacheable cacheable = annotatedClass.getAnnotationUsage( Cacheable.class, modelsContext() );
1664+
final var cacheable = annotatedClass.getAnnotationUsage( Cacheable.class, modelsContext() );
16691665
isCached = cacheable == null && persistentClass.getSuperclass() != null
16701666
// we should inherit the root class caching config
16711667
? persistentClass.getSuperclass().isCached()

0 commit comments

Comments
 (0)