Skip to content

Commit 52c80af

Browse files
committed
use isBlank() instead of isEmpty() to better handle blank annotation values
especially blank column names
1 parent 5383c81 commit 52c80af

28 files changed

+219
-314
lines changed

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public final void doSecondPass(Map<String, PersistentClass> persistentClasses) t
7373
}
7474

7575
private void handleSequenceStrategy() {
76-
if ( generatedValue.generator().isEmpty() ) {
76+
if ( generatedValue.generator().isBlank() ) {
7777
handleUnnamedSequenceGenerator();
7878
}
7979
else {
@@ -86,7 +86,7 @@ private void handleSequenceStrategy() {
8686
protected abstract void handleNamedSequenceGenerator();
8787

8888
private void handleTableStrategy() {
89-
if ( generatedValue.generator().isEmpty() ) {
89+
if ( generatedValue.generator().isBlank() ) {
9090
handleUnnamedTableGenerator();
9191
}
9292
else {
@@ -99,7 +99,7 @@ private void handleTableStrategy() {
9999
protected abstract void handleNamedTableGenerator();
100100

101101
private void handleAutoStrategy() {
102-
if ( generatedValue.generator().isEmpty() ) {
102+
if ( generatedValue.generator().isBlank() ) {
103103
handleUnnamedAutoGenerator();
104104
}
105105
else {
@@ -148,7 +148,7 @@ private Annotation findGeneratorAnnotation(AnnotationTarget annotationTarget) {
148148
protected boolean handleAsLegacyGenerator() {
149149
// Handle a few legacy Hibernate generators...
150150
final String nameFromGeneratedValue = generatedValue.generator();
151-
if ( !nameFromGeneratedValue.isEmpty() ) {
151+
if ( !nameFromGeneratedValue.isBlank() ) {
152152
final Class<? extends Generator> legacyNamedGenerator = mapLegacyNamedGenerator( nameFromGeneratedValue, idValue );
153153
if ( legacyNamedGenerator != null ) {
154154
final Map<String,String> configuration = buildLegacyGeneratorConfig();

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

Lines changed: 23 additions & 140 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
*/
55
package org.hibernate.boot.model.internal;
66

7-
import java.lang.annotation.Annotation;
87
import java.util.ArrayList;
98
import java.util.HashMap;
109
import java.util.List;
@@ -24,7 +23,6 @@
2423
import org.hibernate.boot.spi.MetadataBuildingContext;
2524
import org.hibernate.internal.CoreLogging;
2625
import org.hibernate.internal.util.StringHelper;
27-
import org.hibernate.internal.util.collections.CollectionHelper;
2826
import org.hibernate.models.spi.AnnotationTarget;
2927
import org.hibernate.models.spi.ClassDetails;
3028
import org.hibernate.models.spi.MemberDetails;
@@ -36,7 +34,6 @@
3634

3735
import jakarta.persistence.AssociationOverride;
3836
import jakarta.persistence.AttributeOverride;
39-
import jakarta.persistence.CheckConstraint;
4037
import jakarta.persistence.Column;
4138
import jakarta.persistence.Embeddable;
4239
import jakarta.persistence.Entity;
@@ -47,7 +44,10 @@
4744

4845
import static org.hibernate.boot.model.internal.TimeZoneStorageHelper.isOffsetTimeClass;
4946
import static org.hibernate.boot.model.internal.TimeZoneStorageHelper.useColumnForTimeZoneStorage;
47+
import static org.hibernate.internal.util.StringHelper.isNotBlank;
5048
import static org.hibernate.internal.util.StringHelper.qualify;
49+
import static org.hibernate.internal.util.collections.CollectionHelper.isEmpty;
50+
import static org.hibernate.internal.util.collections.CollectionHelper.isNotEmpty;
5151

5252
/**
5353
* @author Emmanuel Bernard
@@ -153,10 +153,12 @@ public boolean isInIdClass() {
153153
if ( isInIdClass != null ) {
154154
return isInIdClass;
155155
}
156-
if ( parent != null ) {
156+
else if ( parent != null ) {
157157
return parent.isInIdClass();
158158
}
159-
return false;
159+
else {
160+
return false;
161+
}
160162
}
161163

162164
@Override
@@ -441,13 +443,15 @@ private static Map<String, Column[]> buildColumnOverride(
441443
return result;
442444
}
443445

444-
final SourceModelBuildingContext sourceModelContext = context.getMetadataCollector().getSourceModelBuildingContext();
446+
final SourceModelBuildingContext sourceModelContext =
447+
context.getMetadataCollector().getSourceModelBuildingContext();
445448
final Map<String, List<Column>> columnOverrideMap = new HashMap<>();
446449

447-
final AttributeOverride[] overrides = element.getRepeatedAnnotationUsages( AttributeOverride.class, sourceModelContext );
448-
if ( CollectionHelper.isNotEmpty( overrides ) ) {
450+
final AttributeOverride[] overrides =
451+
element.getRepeatedAnnotationUsages( AttributeOverride.class, sourceModelContext );
452+
if ( isNotEmpty( overrides ) ) {
449453
for ( AttributeOverride depAttr : overrides ) {
450-
final String qualifiedName = StringHelper.qualify( path, depAttr.name() );
454+
final String qualifiedName = qualify( path, depAttr.name() );
451455
final Column column = depAttr.column();
452456

453457
if ( columnOverrideMap.containsKey( qualifiedName ) ) {
@@ -529,7 +533,7 @@ private static Column createTemporalColumn(
529533
int secondPrecision;
530534
final Column annotatedColumn = element.getDirectAnnotationUsage( Column.class );
531535
if ( annotatedColumn != null ) {
532-
if ( StringHelper.isNotEmpty( annotatedColumn.name() ) ) {
536+
if ( isNotBlank( annotatedColumn.name() ) ) {
533537
return annotatedColumn;
534538
}
535539
precision = annotatedColumn.precision();
@@ -564,7 +568,8 @@ public MetadataBuildingContext getBuildingContext() {
564568
)
565569
);
566570

567-
final ColumnJpaAnnotation created = JpaAnnotations.COLUMN.createUsage( context.getMetadataCollector().getSourceModelBuildingContext() );
571+
final ColumnJpaAnnotation created =
572+
JpaAnnotations.COLUMN.createUsage( context.getMetadataCollector().getSourceModelBuildingContext() );
568573
if ( StringHelper.isNotEmpty( implicitName.getText() ) ) {
569574
created.name( implicitName.getText() );
570575
}
@@ -587,12 +592,8 @@ private static Map<String, ColumnTransformer> buildColumnTransformerOverride(Ann
587592
private static Map<String, JoinColumn[]> buildJoinColumnOverride(AnnotationTarget element, String path, MetadataBuildingContext context) {
588593
final Map<String, JoinColumn[]> columnOverride = new HashMap<>();
589594
if ( element != null ) {
590-
final AssociationOverride[] overrides = buildAssociationOverrides( element, path, context );
591-
for ( AssociationOverride override : overrides ) {
592-
columnOverride.put(
593-
qualify( path, override.name() ),
594-
override.joinColumns()
595-
);
595+
for ( AssociationOverride override : buildAssociationOverrides( element, path, context ) ) {
596+
columnOverride.put( qualify( path, override.name() ), override.joinColumns() );
596597
}
597598
}
598599
return columnOverride;
@@ -601,12 +602,8 @@ private static Map<String, JoinColumn[]> buildJoinColumnOverride(AnnotationTarge
601602
private static Map<String, ForeignKey> buildForeignKeyOverride(AnnotationTarget element, String path, MetadataBuildingContext context) {
602603
final Map<String, ForeignKey> foreignKeyOverride = new HashMap<>();
603604
if ( element != null ) {
604-
final AssociationOverride[] overrides = buildAssociationOverrides( element, path, context );
605-
for ( AssociationOverride override : overrides ) {
606-
foreignKeyOverride.put(
607-
qualify( path, override.name() ),
608-
override.foreignKey()
609-
);
605+
for ( AssociationOverride override : buildAssociationOverrides( element, path, context ) ) {
606+
foreignKeyOverride.put( qualify( path, override.name() ), override.foreignKey() );
610607
}
611608
}
612609
return foreignKeyOverride;
@@ -619,14 +616,9 @@ private static AssociationOverride[] buildAssociationOverrides(AnnotationTarget
619616
private static Map<String, JoinTable> buildJoinTableOverride(AnnotationTarget element, String path, MetadataBuildingContext context) {
620617
final Map<String, JoinTable> result = new HashMap<>();
621618
if ( element != null ) {
622-
final AssociationOverride[] overrides = buildAssociationOverrides( element, path, context );
623-
for ( AssociationOverride override : overrides ) {
624-
final JoinColumn[] joinColumns = override.joinColumns();
625-
if ( CollectionHelper.isEmpty( joinColumns ) ) {
626-
result.put(
627-
qualify( path, override.name() ),
628-
override.joinTable()
629-
);
619+
for ( AssociationOverride override : buildAssociationOverrides( element, path, context ) ) {
620+
if ( isEmpty( override.joinColumns() ) ) {
621+
result.put( qualify( path, override.name() ), override.joinTable() );
630622
}
631623
}
632624
}
@@ -637,113 +629,4 @@ private static Map<String, JoinTable> buildJoinTableOverride(AnnotationTarget el
637629
public void setParentProperty(String parentProperty) {
638630
throw new AssertionFailure( "Setting the parent property to a non component" );
639631
}
640-
641-
private static class ColumnImpl implements Column {
642-
643-
private final String name;
644-
private final boolean unique;
645-
private final boolean nullable;
646-
private final boolean insertable;
647-
private final boolean updatable;
648-
private final String columnDefinition;
649-
private final String table;
650-
private final int precision;
651-
private final int secondPrecision;
652-
653-
private ColumnImpl(
654-
String name,
655-
boolean unique,
656-
boolean nullable,
657-
boolean insertable,
658-
boolean updatable,
659-
String columnDefinition,
660-
String table,
661-
int precision,
662-
int secondPrecision) {
663-
this.name = name;
664-
this.unique = unique;
665-
this.nullable = nullable;
666-
this.insertable = insertable;
667-
this.updatable = updatable;
668-
this.columnDefinition = columnDefinition;
669-
this.table = table;
670-
this.precision = precision;
671-
this.secondPrecision = secondPrecision;
672-
}
673-
674-
@Override
675-
public String name() {
676-
return name;
677-
}
678-
679-
@Override
680-
public boolean unique() {
681-
return unique;
682-
}
683-
684-
@Override
685-
public boolean nullable() {
686-
return nullable;
687-
}
688-
689-
@Override
690-
public boolean insertable() {
691-
return insertable;
692-
}
693-
694-
@Override
695-
public boolean updatable() {
696-
return updatable;
697-
}
698-
699-
@Override
700-
public String columnDefinition() {
701-
return columnDefinition;
702-
}
703-
704-
@Override
705-
public String options() {
706-
return "";
707-
}
708-
709-
@Override
710-
public String table() {
711-
return table;
712-
}
713-
714-
@Override
715-
public int length() {
716-
return 255;
717-
}
718-
719-
@Override
720-
public int precision() {
721-
return precision;
722-
}
723-
724-
@Override
725-
public int scale() {
726-
return 0;
727-
}
728-
729-
@Override
730-
public int secondPrecision() {
731-
return secondPrecision;
732-
}
733-
734-
@Override
735-
public CheckConstraint[] check() {
736-
return new CheckConstraint[0];
737-
}
738-
739-
@Override
740-
public String comment() {
741-
return "";
742-
}
743-
744-
@Override
745-
public Class<? extends Annotation> annotationType() {
746-
return Column.class;
747-
}
748-
}
749632
}

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

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@
2828
import org.hibernate.boot.spi.PropertyData;
2929
import org.hibernate.internal.CoreMessageLogger;
3030
import org.hibernate.internal.util.StringHelper;
31-
import org.hibernate.internal.util.collections.ArrayHelper;
32-
import org.hibernate.internal.util.collections.CollectionHelper;
3331
import org.hibernate.mapping.AggregateColumn;
3432
import org.hibernate.mapping.CheckConstraint;
3533
import org.hibernate.mapping.Column;
@@ -46,9 +44,13 @@
4644
import static org.hibernate.boot.model.internal.BinderHelper.getPath;
4745
import static org.hibernate.boot.model.internal.BinderHelper.getRelativePath;
4846
import static org.hibernate.boot.model.internal.DialectOverridesAnnotationHelper.getOverridableAnnotation;
47+
import static org.hibernate.internal.util.StringHelper.isBlank;
4948
import static org.hibernate.internal.util.StringHelper.isEmpty;
5049
import static org.hibernate.internal.util.StringHelper.isNotEmpty;
50+
import static org.hibernate.internal.util.StringHelper.nullIfBlank;
5151
import static org.hibernate.internal.util.StringHelper.nullIfEmpty;
52+
import static org.hibernate.internal.util.collections.ArrayHelper.isEmpty;
53+
import static org.hibernate.internal.util.collections.CollectionHelper.isNotEmpty;
5254

5355
/**
5456
* A mapping to a column, logically representing a
@@ -664,7 +666,7 @@ public static AnnotatedColumns buildColumnsOrFormulaFromAnnotation(
664666
}
665667
else {
666668
final jakarta.persistence.Column[] actualColumns = overrideColumns( columns, propertyHolder, inferredData );
667-
if ( ArrayHelper.isEmpty( actualColumns ) ) {
669+
if ( isEmpty( actualColumns ) ) {
668670
return buildImplicitColumn(
669671
fractionalSeconds,
670672
inferredData,
@@ -708,7 +710,7 @@ private static jakarta.persistence.Column[] overrideColumns(
708710
+ " columns (every column must have exactly one '@AttributeOverride')" );
709711
}
710712
LOG.debugf( "Column(s) overridden for property %s", inferredData.getPropertyName() );
711-
return ArrayHelper.isEmpty( overriddenCols ) ? null : overriddenCols;
713+
return isEmpty( overriddenCols ) ? null : overriddenCols;
712714
}
713715
else {
714716
return columns;
@@ -760,7 +762,7 @@ private static String getTableName(
760762
jakarta.persistence.Column column,
761763
Database database) {
762764
final String table = column.table();
763-
return table.isEmpty()
765+
return table.isBlank()
764766
? ""
765767
: database.getJdbcEnvironment().getIdentifierHelper().toIdentifier( table ).render();
766768
}
@@ -769,7 +771,7 @@ private static String getSqlType(
769771
MetadataBuildingContext context,
770772
jakarta.persistence.Column column) {
771773
final String columnDefinition = column.columnDefinition();
772-
return columnDefinition.isEmpty()
774+
return columnDefinition.isBlank()
773775
? null
774776
: context.getObjectNameNormalizer().applyGlobalQuoting( columnDefinition );
775777
}
@@ -844,7 +846,7 @@ private static String logicalColumnName(
844846

845847
private static String getColumnName(Database database, jakarta.persistence.Column column) {
846848
final String name = column.name();
847-
return name.isEmpty()
849+
return name.isBlank()
848850
? null
849851
: database.getJdbcEnvironment().getIdentifierHelper().toIdentifier( name ).render();
850852
}
@@ -896,7 +898,7 @@ private void applyColumnCheckConstraint(jakarta.persistence.Column column) {
896898
}
897899

898900
void applyCheckConstraints(jakarta.persistence.CheckConstraint[] checkConstraintAnnotationUsages) {
899-
if ( CollectionHelper.isNotEmpty( checkConstraintAnnotationUsages ) ) {
901+
if ( isNotEmpty( checkConstraintAnnotationUsages ) ) {
900902
for ( jakarta.persistence.CheckConstraint checkConstraintAnnotationUsage : checkConstraintAnnotationUsages ) {
901903
addCheckConstraint(
902904
checkConstraintAnnotationUsage.name(),
@@ -959,10 +961,10 @@ private void processColumnTransformerExpressions(ColumnTransformer annotation) {
959961
}
960962

961963
final String targetColumnName = annotation.forColumn();
962-
if ( isEmpty( targetColumnName )
964+
if ( isBlank( targetColumnName )
963965
|| targetColumnName.equals( logicalColumnName != null ? logicalColumnName : "" ) ) {
964-
readExpression = nullIfEmpty( annotation.read() );
965-
writeExpression = nullIfEmpty( annotation.write() );
966+
readExpression = nullIfBlank( annotation.read() );
967+
writeExpression = nullIfBlank( annotation.write() );
966968
}
967969
}
968970

@@ -1016,7 +1018,7 @@ private static AnnotatedColumns buildImplicitColumn(
10161018

10171019
@Override
10181020
public String toString() {
1019-
StringBuilder string = new StringBuilder();
1021+
final StringBuilder string = new StringBuilder();
10201022
string.append( getClass().getSimpleName() ).append( "(" );
10211023
if ( isNotEmpty( logicalColumnName ) ) {
10221024
string.append( "column='" ).append( logicalColumnName ).append( "'," );
@@ -1040,7 +1042,7 @@ private void applyColumnOptions(jakarta.persistence.Column column) {
10401042
}
10411043

10421044
private void applyColumnComment(jakarta.persistence.Column column) {
1043-
if ( !column.comment().isEmpty() ) {
1045+
if ( !column.comment().isBlank() ) {
10441046
comment = column.comment();
10451047
}
10461048
}

0 commit comments

Comments
 (0)