Skip to content

Commit e85263d

Browse files
dreab8sebersole
authored andcommitted
HHH-17504 Fixed IllegalArgumentException caused by setting AnnotationUsage attributes values to null (#219)
HHH-17504 - Ongoing JPA 32 work
1 parent 13758fb commit e85263d

14 files changed

+274
-223
lines changed

hibernate-core/src/main/java/org/hibernate/boot/model/IdentifierGeneratorDefinition.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import static java.util.Collections.emptyMap;
2828
import static java.util.Collections.unmodifiableMap;
2929
import static org.hibernate.boot.models.JpaAnnotations.TABLE_GENERATOR;
30+
import static org.hibernate.boot.models.internal.AnnotationUsageHelper.applyStringAttributeIfSpecified;
3031
import static org.hibernate.internal.util.collections.CollectionHelper.isEmpty;
3132

3233
/**
@@ -161,7 +162,7 @@ private static IdentifierGeneratorDefinition buildSequenceGeneratorDefinition(St
161162
null,
162163
null
163164
);
164-
sequenceGeneratorUsage.setAttributeValue( "name", name );
165+
applyStringAttributeIfSpecified( "name", name, sequenceGeneratorUsage );
165166
GenerationStrategyInterpreter.STRATEGY_INTERPRETER.interpretSequenceGenerator( sequenceGeneratorUsage, builder );
166167
return builder.build();
167168
}

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

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.hibernate.boot.model.naming.ImplicitBasicColumnNameSource;
2323
import org.hibernate.boot.model.source.spi.AttributePath;
2424
import org.hibernate.boot.models.JpaAnnotations;
25+
import org.hibernate.boot.models.internal.AnnotationUsageHelper;
2526
import org.hibernate.boot.spi.MetadataBuildingContext;
2627
import org.hibernate.internal.CoreLogging;
2728
import org.hibernate.internal.util.StringHelper;
@@ -490,18 +491,27 @@ private static AnnotationUsage<Column> createTimeZoneColumn(
490491
final String columnName = timeZoneColumn != null
491492
? timeZoneColumn.getString( "name" )
492493
: column.getString( "name" ) + "_tz";
493-
created.setAttributeValue( "name", columnName );
494-
created.setAttributeValue( "nullable", column.getBoolean( "nullable" ) );
494+
AnnotationUsageHelper.applyStringAttributeIfSpecified( "name", columnName, created );
495+
AnnotationUsageHelper.applyAttributeIfSpecified(
496+
"nullable",
497+
column.getBoolean( "nullable" ),
498+
created
499+
);
495500

496501
final AnnotationUsage<?> source = timeZoneColumn != null
497502
? timeZoneColumn
498503
: column;
499-
created.setAttributeValue( "table", source.getAttributeValue( "table" ) );
500-
created.setAttributeValue( "insertable", source.getAttributeValue( "insertable" ) );
501-
created.setAttributeValue( "updatable", source.getAttributeValue( "updatable" ) );
504+
AnnotationUsageHelper.applyStringAttributeIfSpecified( "table", source.getAttributeValue( "table" ), created );
505+
AnnotationUsageHelper.applyAttributeIfSpecified( "insertable", source.getAttributeValue( "insertable" ), created );
506+
AnnotationUsageHelper.applyAttributeIfSpecified( "updatable", source.getAttributeValue( "updatable" ), created );
502507

503508
if ( timeZoneColumn != null ) {
504-
created.setAttributeValue( "columnDefinition", timeZoneColumn.getAttributeValue( "columnDefinition" ) );
509+
AnnotationUsageHelper
510+
.applyStringAttributeIfSpecified(
511+
"columnDefinition",
512+
timeZoneColumn.getAttributeValue( "columnDefinition" ),
513+
created
514+
);
505515
}
506516
},
507517
context.getMetadataCollector().getSourceModelBuildingContext()
@@ -551,7 +561,7 @@ public MetadataBuildingContext getBuildingContext() {
551561
return JpaAnnotations.COLUMN.createUsage(
552562
element,
553563
(created) -> {
554-
created.setAttributeValue( "name", implicitName.getText() );
564+
AnnotationUsageHelper.applyStringAttributeIfSpecified( "name", implicitName.getText(), created );
555565
created.setAttributeValue( "precision", precision );
556566
},
557567
context.getMetadataCollector().getSourceModelBuildingContext()

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

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import org.hibernate.models.spi.AnnotationDescriptorRegistry;
2424
import org.hibernate.models.spi.AnnotationUsage;
2525
import org.hibernate.models.spi.MemberDetails;
26-
import org.hibernate.models.spi.MutableAnnotationUsage;
2726
import org.hibernate.models.spi.SourceModelBuildingContext;
2827

2928
import jakarta.persistence.CheckConstraint;
@@ -48,6 +47,7 @@
4847
import static org.hibernate.boot.model.internal.BinderHelper.getOverridableAnnotation;
4948
import static org.hibernate.boot.model.internal.BinderHelper.getPath;
5049
import static org.hibernate.boot.model.internal.BinderHelper.getPropertyOverriddenByMapperOrMapsId;
50+
import static org.hibernate.boot.models.internal.AnnotationUsageHelper.applyAttributeIfSpecified;
5151
import static org.hibernate.internal.util.StringHelper.nullIfEmpty;
5252

5353
/**
@@ -320,24 +320,36 @@ private AnnotationUsage<JoinColumn> makePrimaryKeyJoinColumnAdapter(
320320
return joinColumnDescriptor.createUsage(
321321
property,
322322
(usage) -> {
323-
transferAttribute( "name", pkJoinColumnAnn, usage );
324-
transferAttribute( "referencedColumnName", pkJoinColumnAnn, usage );
325-
transferAttribute( "columnDefinition", pkJoinColumnAnn, usage );
326-
transferAttribute( "options", pkJoinColumnAnn, usage );
327-
transferAttribute( "foreignKey", pkJoinColumnAnn, usage );
323+
applyAttributeIfSpecified(
324+
"name",
325+
pkJoinColumnAnn.getAttributeValue( "name" ),
326+
usage
327+
);
328+
applyAttributeIfSpecified(
329+
"referencedColumnName",
330+
pkJoinColumnAnn.getAttributeValue( "referencedColumnName" ),
331+
usage
332+
);
333+
applyAttributeIfSpecified(
334+
"columnDefinition",
335+
pkJoinColumnAnn.getAttributeValue( "columnDefinition" ),
336+
usage
337+
);
338+
applyAttributeIfSpecified(
339+
"options",
340+
pkJoinColumnAnn.getAttributeValue( "options" ),
341+
usage
342+
);
343+
applyAttributeIfSpecified(
344+
"foreignKey",
345+
pkJoinColumnAnn.getAttributeValue( "foreignKey" ),
346+
usage
347+
);
328348
},
329349
hibernateModelsContext
330350
);
331351
}
332352

333-
@SuppressWarnings({ "rawtypes", "unchecked" })
334-
private void transferAttribute(
335-
String attributeName,
336-
AnnotationUsage source,
337-
MutableAnnotationUsage target) {
338-
target.setAttributeValue( attributeName, source.getAttributeValue( attributeName ) );
339-
}
340-
341353
/**
342354
* Useful to override a column either by {@code @MapsId} or by {@code @IdClass}
343355
*/

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@
159159
import static org.hibernate.boot.model.internal.PropertyHolderBuilder.buildPropertyHolder;
160160
import static org.hibernate.boot.model.internal.TableBinder.bindForeignKey;
161161
import static org.hibernate.boot.model.naming.Identifier.toIdentifier;
162+
import static org.hibernate.boot.models.internal.AnnotationUsageHelper.applyAttributeIfSpecified;
162163
import static org.hibernate.engine.OptimisticLockStyle.fromLockType;
163164
import static org.hibernate.engine.spi.ExecuteUpdateResultCheckStyle.fromResultCheckStyle;
164165
import static org.hibernate.internal.util.ReflectHelper.getDefaultSupplier;
@@ -1765,8 +1766,12 @@ private static AnnotationUsage<Cache> buildCacheMock(ClassDetails classDetails,
17651766
classDetails,
17661767
context.getMetadataCollector().getSourceModelBuildingContext()
17671768
);
1768-
cacheUsage.setAttributeValue( "region", classDetails.getName() );
1769-
cacheUsage.setAttributeValue( "usage", determineCacheConcurrencyStrategy( context ) );
1769+
applyAttributeIfSpecified( "region", classDetails.getName(), cacheUsage );
1770+
applyAttributeIfSpecified(
1771+
"usage",
1772+
determineCacheConcurrencyStrategy( context ),
1773+
cacheUsage
1774+
);
17701775
return cacheUsage;
17711776
}
17721777

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

Lines changed: 49 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@
2020
import jakarta.persistence.JoinColumn;
2121
import jakarta.persistence.MapKeyJoinColumn;
2222

23+
import static org.hibernate.boot.models.internal.AnnotationUsageHelper.applyAttributeIfSpecified;
24+
import static org.hibernate.boot.models.internal.AnnotationUsageHelper.applyStringAttributeIfSpecified;
25+
26+
2327
/**
2428
* @author Emmanuel Bernard
2529
*/
@@ -44,16 +48,52 @@ public static MutableAnnotationUsage<JoinColumn> fromMapKeyJoinColumn(
4448
context.getMetadataCollector().getSourceModelBuildingContext()
4549
);
4650

47-
joinColumn.setAttributeValue( "name", mapKeyJoinColumn.getAttributeValue( "name" ) );
48-
joinColumn.setAttributeValue( "table", mapKeyJoinColumn.getAttributeValue( "table" ) );
49-
joinColumn.setAttributeValue( "unique", mapKeyJoinColumn.getAttributeValue( "unique" ) );
50-
joinColumn.setAttributeValue( "nullable", mapKeyJoinColumn.getAttributeValue( "nullable" ) );
51-
joinColumn.setAttributeValue( "insertable", mapKeyJoinColumn.getAttributeValue( "insertable" ) );
52-
joinColumn.setAttributeValue( "referencedColumnName", mapKeyJoinColumn.getAttributeValue( "referencedColumnName" ) );
53-
joinColumn.setAttributeValue( "columnDefinition", mapKeyJoinColumn.getAttributeValue( "columnDefinition" ) );
54-
joinColumn.setAttributeValue( "options", mapKeyJoinColumn.getAttributeValue( "options" ) );
51+
applyStringAttributeIfSpecified(
52+
"name",
53+
mapKeyJoinColumn.getAttributeValue( "name" ),
54+
joinColumn
55+
);
56+
applyStringAttributeIfSpecified(
57+
"table",
58+
mapKeyJoinColumn.getAttributeValue( "table" ),
59+
joinColumn
60+
);
61+
applyAttributeIfSpecified(
62+
"unique",
63+
mapKeyJoinColumn.getAttributeValue( "unique" ),
64+
joinColumn
65+
);
66+
applyAttributeIfSpecified(
67+
"nullable",
68+
mapKeyJoinColumn.getAttributeValue( "nullable" ),
69+
joinColumn
70+
);
71+
applyAttributeIfSpecified(
72+
"insertable",
73+
mapKeyJoinColumn.getAttributeValue( "insertable" ),
74+
joinColumn
75+
);
76+
applyStringAttributeIfSpecified(
77+
"referencedColumnName",
78+
mapKeyJoinColumn.getAttributeValue( "referencedColumnName" ),
79+
joinColumn
80+
);
81+
applyStringAttributeIfSpecified(
82+
"columnDefinition",
83+
mapKeyJoinColumn.getAttributeValue( "columnDefinition" ),
84+
joinColumn
85+
);
86+
applyStringAttributeIfSpecified(
87+
"options",
88+
mapKeyJoinColumn.getAttributeValue( "options" ),
89+
joinColumn
90+
);
5591
// joinColumn.setAttributeValue( "comment", mapKeyJoinColumn.getAttributeValue( "comment" ) );
56-
joinColumn.setAttributeValue( "foreignKey", mapKeyJoinColumn.getAttributeValue( "foreignKey" ) );
92+
applyAttributeIfSpecified(
93+
"foreignKey",
94+
mapKeyJoinColumn.getAttributeValue( "foreignKey" ),
95+
joinColumn
96+
);
5797

5898
return joinColumn;
5999
}

0 commit comments

Comments
 (0)