Skip to content

Commit 5f8bf12

Browse files
committed
HHH-18619 add support for @foreignkey(options), @UniqueConstraint(options), @Index(options)
1 parent 9f2beca commit 5f8bf12

29 files changed

+196
-104
lines changed

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2075,13 +2075,15 @@ private DependantValue buildCollectionKey(AnnotatedJoinColumns joinColumns, OnDe
20752075
else {
20762076
key.setForeignKeyName( nullIfEmpty( foreignKey.name() ) );
20772077
key.setForeignKeyDefinition( nullIfEmpty( foreignKey.foreignKeyDefinition() ) );
2078+
key.setForeignKeyOptions( foreignKey.options() );
20782079
if ( key.getForeignKeyName() == null
20792080
&& key.getForeignKeyDefinition() == null
20802081
&& collectionTableAnn.joinColumns().length == 1 ) {
20812082
final JoinColumn joinColumn = collectionTableAnn.joinColumns()[0];
20822083
final ForeignKey nestedForeignKey = joinColumn.foreignKey();
20832084
key.setForeignKeyName( nullIfEmpty( nestedForeignKey.name() ) );
20842085
key.setForeignKeyDefinition( nullIfEmpty( nestedForeignKey.foreignKeyDefinition() ) );
2086+
key.setForeignKeyOptions( nestedForeignKey.options() );
20852087
}
20862088
}
20872089
}
@@ -2091,6 +2093,7 @@ private DependantValue buildCollectionKey(AnnotatedJoinColumns joinColumns, OnDe
20912093
final ForeignKey foreignKey = joinTableAnn.foreignKey();
20922094
String foreignKeyName = foreignKey.name();
20932095
String foreignKeyDefinition = foreignKey.foreignKeyDefinition();
2096+
String foreignKeyOptions = foreignKey.options();
20942097
ConstraintMode foreignKeyValue = foreignKey.value();
20952098
final JoinColumn[] joinColumnAnnotations = joinTableAnn.joinColumns();
20962099
if ( !ArrayHelper.isEmpty( joinColumnAnnotations ) ) {
@@ -2099,6 +2102,7 @@ private DependantValue buildCollectionKey(AnnotatedJoinColumns joinColumns, OnDe
20992102
if ( foreignKeyName.isEmpty() ) {
21002103
foreignKeyName = joinColumnForeignKey.name();
21012104
foreignKeyDefinition = joinColumnForeignKey.foreignKeyDefinition();
2105+
foreignKeyOptions = joinColumnForeignKey.options();
21022106
}
21032107
if ( foreignKeyValue != NO_CONSTRAINT ) {
21042108
foreignKeyValue = joinColumnForeignKey.value();
@@ -2111,6 +2115,7 @@ private DependantValue buildCollectionKey(AnnotatedJoinColumns joinColumns, OnDe
21112115
else {
21122116
key.setForeignKeyName( nullIfEmpty( foreignKeyName ) );
21132117
key.setForeignKeyDefinition( nullIfEmpty( foreignKeyDefinition ) );
2118+
key.setForeignKeyOptions( foreignKeyOptions );
21142119
}
21152120
}
21162121
else {
@@ -2155,6 +2160,7 @@ private static void handleForeignKeyConstraint(
21552160
else {
21562161
key.setForeignKeyName( nullIfEmpty( foreignKey.name() ) );
21572162
key.setForeignKeyDefinition( nullIfEmpty( foreignKey.foreignKeyDefinition() ) );
2163+
key.setForeignKeyOptions( foreignKey.options() );
21582164
}
21592165
}
21602166

@@ -2425,6 +2431,7 @@ private ManyToOne handleCollectionOfEntities(
24252431
final ForeignKey inverseForeignKey = joinTableAnn.inverseForeignKey();
24262432
String foreignKeyName = inverseForeignKey.name();
24272433
String foreignKeyDefinition = inverseForeignKey.foreignKeyDefinition();
2434+
String foreignKeyOptions = inverseForeignKey.options();
24282435

24292436
final JoinColumn[] inverseJoinColumns = joinTableAnn.inverseJoinColumns();
24302437
if ( !ArrayHelper.isEmpty( inverseJoinColumns ) ) {
@@ -2433,6 +2440,7 @@ private ManyToOne handleCollectionOfEntities(
24332440
final ForeignKey inverseJoinColumnForeignKey = joinColumnAnn.foreignKey();
24342441
foreignKeyName = inverseJoinColumnForeignKey.name();
24352442
foreignKeyDefinition = inverseJoinColumnForeignKey.foreignKeyDefinition();
2443+
foreignKeyOptions = inverseJoinColumnForeignKey.options();
24362444
}
24372445
}
24382446

@@ -2445,6 +2453,7 @@ private ManyToOne handleCollectionOfEntities(
24452453
else {
24462454
element.setForeignKeyName( nullIfEmpty( foreignKeyName ) );
24472455
element.setForeignKeyDefinition( nullIfEmpty( foreignKeyDefinition ) );
2456+
element.setForeignKeyOptions( foreignKeyOptions );
24482457
}
24492458
}
24502459
return element;

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@
5454
import org.hibernate.annotations.TypeBinderType;
5555
import org.hibernate.annotations.View;
5656
import org.hibernate.binder.TypeBinder;
57-
import org.hibernate.boot.model.IdentifierGeneratorDefinition;
5857
import org.hibernate.boot.model.NamedEntityGraphDefinition;
5958
import org.hibernate.boot.model.internal.InheritanceState.ElementsToProcess;
6059
import org.hibernate.boot.model.naming.EntityNaming;
@@ -896,6 +895,7 @@ private void handleForeignKeys(ClassDetails clazzToProcess, MetadataBuildingCont
896895
else if ( foreignKey != null ) {
897896
key.setForeignKeyName( nullIfEmpty( foreignKey.name() ) );
898897
key.setForeignKeyDefinition( nullIfEmpty( foreignKey.foreignKeyDefinition() ) );
898+
key.setForeignKeyOptions( foreignKey.options() );
899899
}
900900
else if ( noConstraintByDefault ) {
901901
key.disableForeignKey();
@@ -904,11 +904,13 @@ else if ( pkJoinColumns != null ) {
904904
final ForeignKey nestedFk = pkJoinColumns.foreignKey();
905905
key.setForeignKeyName( nullIfEmpty( nestedFk.name() ) );
906906
key.setForeignKeyDefinition( nullIfEmpty( nestedFk.foreignKeyDefinition() ) );
907+
key.setForeignKeyOptions( nestedFk.options() );
907908
}
908909
else if ( pkJoinColumn != null ) {
909910
final ForeignKey nestedFk = pkJoinColumn.foreignKey();
910911
key.setForeignKeyName( nullIfEmpty( nestedFk.name() ) );
911912
key.setForeignKeyDefinition( nullIfEmpty( nestedFk.foreignKeyDefinition() ) );
913+
key.setForeignKeyOptions( nestedFk.options() );
912914
}
913915
}
914916
}
@@ -1987,6 +1989,7 @@ private void setForeignKeyNameIfDefined(Join join) {
19871989
else {
19881990
key.setForeignKeyName( nullIfEmpty( jpaSecondaryTable.foreignKey().name() ) );
19891991
key.setForeignKeyDefinition( nullIfEmpty( jpaSecondaryTable.foreignKey().foreignKeyDefinition() ) );
1992+
key.setForeignKeyOptions( jpaSecondaryTable.foreignKey().options() );
19901993
}
19911994
}
19921995
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ private void createIndexOrUniqueKey(
160160
String[] columnNames,
161161
String[] orderings,
162162
boolean unique,
163+
String options,
163164
Selectable[] columns) {
164165
final IndexOrUniqueKeyNameSource source =
165166
new IndexOrUniqueKeyNameSource( context, table, columnNames, originalKeyName );
@@ -174,6 +175,7 @@ private void createIndexOrUniqueKey(
174175
final UniqueKey uniqueKey = table.getOrCreateUniqueKey( keyName );
175176
uniqueKey.setExplicit( true );
176177
uniqueKey.setNameExplicit( nameExplicit );
178+
uniqueKey.setOptions( options );
177179
for ( int i = 0; i < columns.length; i++ ) {
178180
uniqueKey.addColumn( (Column) columns[i], orderings != null ? orderings[i] : null );
179181
}
@@ -182,6 +184,7 @@ private void createIndexOrUniqueKey(
182184
final String keyName = getImplicitNamingStrategy().determineIndexName( source ).render( getDialect() );
183185
final Index index = table.getOrCreateIndex( keyName );
184186
index.setUnique( unique );
187+
index.setOptions( options );
185188
for ( int i = 0; i < columns.length; i++ ) {
186189
index.addColumn( columns[i], orderings != null ? orderings[i] : null );
187190
}
@@ -203,13 +206,15 @@ void bindIndexes(Table table, jakarta.persistence.Index[] indexes) {
203206
initializeColumns( columnExpressions, ordering, parsed );
204207
final String name = index.name();
205208
final boolean unique = index.unique();
209+
final String options = index.options();
206210
createIndexOrUniqueKey(
207211
table,
208212
name,
209213
!name.isEmpty(),
210214
columnExpressions,
211215
ordering,
212216
unique,
217+
options,
213218
selectables( table, name, columnExpressions )
214219
);
215220
}
@@ -219,13 +224,15 @@ void bindUniqueConstraints(Table table, UniqueConstraint[] constraints) {
219224
for ( UniqueConstraint constraint : constraints ) {
220225
final String name = constraint.name();
221226
final String[] columnNames = constraint.columnNames();
227+
final String options = constraint.options();
222228
createIndexOrUniqueKey(
223229
table,
224230
name,
225231
!name.isEmpty(),
226232
columnNames,
227233
null,
228234
true,
235+
options,
229236
columns( table, name, columnNames )
230237
);
231238
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,7 @@ private void handleForeignKey(MemberDetails property, ManyToOne element) {
319319
else {
320320
element.setForeignKeyName( nullIfEmpty( foreignKey.name() ) );
321321
element.setForeignKeyDefinition( nullIfEmpty( foreignKey.foreignKeyDefinition() ) );
322+
element.setForeignKeyOptions( foreignKey.options() );
322323
}
323324
}
324325
}
@@ -495,8 +496,7 @@ else if ( value instanceof SimpleValue ) {
495496

496497
private SimpleValue createTargetValue(Table mapKeyTable, SimpleValue sourceValue) {
497498
final SimpleValue targetValue;
498-
if ( sourceValue instanceof ManyToOne ) {
499-
final ManyToOne sourceManyToOne = (ManyToOne) sourceValue;
499+
if ( sourceValue instanceof ManyToOne sourceManyToOne ) {
500500
final ManyToOne targetManyToOne = new ManyToOne( getBuildingContext(), mapKeyTable);
501501
targetManyToOne.setFetchMode( FetchMode.DEFAULT );
502502
targetManyToOne.setLazy( true );

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -609,6 +609,7 @@ public static void bindForeignKeyNameAndDefinition(
609609
else if ( foreignKey != null ) {
610610
value.setForeignKeyName( nullIfEmpty( foreignKey.name() ) );
611611
value.setForeignKeyDefinition( nullIfEmpty( foreignKey.foreignKeyDefinition() ) );
612+
value.setForeignKeyOptions( foreignKey.options() );
612613
}
613614
else if ( noConstraintByDefault ) {
614615
value.disableForeignKey();
@@ -617,11 +618,13 @@ else if ( joinColumns != null ) {
617618
final ForeignKey joinColumnsForeignKey = joinColumns.foreignKey();
618619
value.setForeignKeyName( nullIfEmpty( joinColumnsForeignKey.name() ) );
619620
value.setForeignKeyDefinition( nullIfEmpty( joinColumnsForeignKey.foreignKeyDefinition() ) );
621+
value.setForeignKeyOptions( joinColumnsForeignKey.options() );
620622
}
621623
else if ( joinColumn != null ) {
622624
final ForeignKey joinColumnForeignKey = joinColumn.foreignKey();
623625
value.setForeignKeyName( nullIfEmpty( joinColumnForeignKey.name() ) );
624626
value.setForeignKeyDefinition( nullIfEmpty( joinColumnForeignKey.foreignKeyDefinition() ) );
627+
value.setForeignKeyOptions( joinColumnForeignKey.options() );
625628
}
626629
}
627630
}

hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -112,10 +112,10 @@
112112
import org.hibernate.loader.ast.spi.MultiKeyLoadSizingStrategy;
113113
import org.hibernate.mapping.CheckConstraint;
114114
import org.hibernate.mapping.Column;
115-
import org.hibernate.mapping.Constraint;
116115
import org.hibernate.mapping.ForeignKey;
117116
import org.hibernate.mapping.Index;
118117
import org.hibernate.mapping.Table;
118+
import org.hibernate.mapping.UniqueKey;
119119
import org.hibernate.mapping.UserDefinedType;
120120
import org.hibernate.metamodel.mapping.EntityMappingType;
121121
import org.hibernate.metamodel.spi.RuntimeModelCreationContext;
@@ -3274,42 +3274,42 @@ public Cleaner getTableCleaner() {
32743274
}
32753275

32763276
/**
3277-
* Get an {@link Exporter} for {@link UserDefinedType}s,
3277+
* Get an {@link Exporter} for {@link UserDefinedType user defined types},
32783278
* usually {@link StandardUserDefinedTypeExporter}.
32793279
*/
32803280
public Exporter<UserDefinedType> getUserDefinedTypeExporter() {
32813281
return userDefinedTypeExporter;
32823282
}
32833283

32843284
/**
3285-
* Get an {@link Exporter} for {@link Sequence}s,
3285+
* Get an {@link Exporter} for {@linkplain Sequence sequences},
32863286
* usually {@link StandardSequenceExporter}.
32873287
*/
32883288
public Exporter<Sequence> getSequenceExporter() {
32893289
return sequenceExporter;
32903290
}
32913291

32923292
/**
3293-
* Get an {@link Exporter} for {@link Index}es,
3293+
* Get an {@link Exporter} for {@linkplain Index indexes},
32943294
* usually {@link StandardIndexExporter}.
32953295
*/
32963296
public Exporter<Index> getIndexExporter() {
32973297
return indexExporter;
32983298
}
32993299

33003300
/**
3301-
* Get an {@link Exporter} for {@link ForeignKey}s,
3301+
* Get an {@link Exporter} for {@linkplain ForeignKey foreign key} constraints,
33023302
* usually {@link StandardForeignKeyExporter}.
33033303
*/
33043304
public Exporter<ForeignKey> getForeignKeyExporter() {
33053305
return foreignKeyExporter;
33063306
}
33073307

33083308
/**
3309-
* Get an {@link Exporter} for unique key {@link Constraint}s,
3309+
* Get an {@link Exporter} for {@linkplain UniqueKey unique key} constraints,
33103310
* usually {@link StandardUniqueKeyExporter}.
33113311
*/
3312-
public Exporter<Constraint> getUniqueKeyExporter() {
3312+
public Exporter<UniqueKey> getUniqueKeyExporter() {
33133313
return uniqueKeyExporter;
33143314
}
33153315

hibernate-core/src/main/java/org/hibernate/dialect/DialectDelegateWrapper.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,10 @@
4949
import org.hibernate.exception.spi.ViolatedConstraintNameExtractor;
5050
import org.hibernate.loader.ast.spi.MultiKeyLoadSizingStrategy;
5151
import org.hibernate.mapping.Column;
52-
import org.hibernate.mapping.Constraint;
5352
import org.hibernate.mapping.ForeignKey;
5453
import org.hibernate.mapping.Index;
5554
import org.hibernate.mapping.Table;
55+
import org.hibernate.mapping.UniqueKey;
5656
import org.hibernate.mapping.UserDefinedType;
5757
import org.hibernate.metamodel.mapping.EntityMappingType;
5858
import org.hibernate.metamodel.spi.RuntimeModelCreationContext;
@@ -866,7 +866,7 @@ public Exporter<ForeignKey> getForeignKeyExporter() {
866866
}
867867

868868
@Override
869-
public Exporter<Constraint> getUniqueKeyExporter() {
869+
public Exporter<UniqueKey> getUniqueKeyExporter() {
870870
return wrapped.getUniqueKeyExporter();
871871
}
872872

hibernate-core/src/main/java/org/hibernate/dialect/SpannerDialect.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import org.hibernate.event.spi.EventSource;
3131
import org.hibernate.internal.util.collections.ArrayHelper;
3232
import org.hibernate.mapping.Column;
33-
import org.hibernate.mapping.Constraint;
3433
import org.hibernate.mapping.ForeignKey;
3534
import org.hibernate.mapping.Table;
3635
import org.hibernate.mapping.UniqueKey;
@@ -802,7 +801,7 @@ public Exporter<ForeignKey> getForeignKeyExporter() {
802801
}
803802

804803
@Override
805-
public Exporter<Constraint> getUniqueKeyExporter() {
804+
public Exporter<UniqueKey> getUniqueKeyExporter() {
806805
return NOOP_EXPORTER;
807806
}
808807

hibernate-core/src/main/java/org/hibernate/dialect/unique/AlterTableUniqueDelegate.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
import org.hibernate.mapping.Table;
1414
import org.hibernate.mapping.UniqueKey;
1515

16+
import static org.hibernate.internal.util.StringHelper.isNotEmpty;
17+
1618
/**
1719
* A {@link UniqueDelegate} which uses {@code alter table} commands to create and drop
1820
* the unique constraint. When possible, prefer {@link CreateTableUniqueDelegate}.
@@ -68,7 +70,11 @@ protected String uniqueConstraintSql(UniqueKey uniqueKey) {
6870
fragment.append( " " ).append( uniqueKey.getColumnOrderMap().get( column ) );
6971
}
7072
}
71-
return fragment.append( ')' ).toString();
73+
fragment.append( ')' );
74+
if ( isNotEmpty( uniqueKey.getOptions() ) ) {
75+
fragment.append( " " ).append( uniqueKey.getOptions() );
76+
}
77+
return fragment.toString();
7278
}
7379

7480
@Override

hibernate-core/src/main/java/org/hibernate/dialect/unique/CreateTableUniqueDelegate.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ protected void appendUniqueConstraint(StringBuilder fragment, UniqueKey uniqueKe
7676
if ( uniqueKey.isNameExplicit() ) {
7777
fragment.append( "constraint " ).append( uniqueKey.getName() ).append( " " );
7878
}
79-
fragment.append( uniqueConstraintSql(uniqueKey) );
79+
fragment.append( uniqueConstraintSql( uniqueKey ) );
8080
}
8181

8282
private static boolean isSingleColumnUnique(Table table, UniqueKey uniqueKey) {

0 commit comments

Comments
 (0)