Skip to content

Commit 11d9c47

Browse files
committed
make it easier to customize ImplicitNamingStrategyJpaCompliantImpl
1 parent a65e301 commit 11d9c47

File tree

6 files changed

+94
-27
lines changed

6 files changed

+94
-27
lines changed

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

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -158,10 +158,11 @@ private void createIndexOrUniqueKey(
158158
String[] columnNames,
159159
String[] orderings,
160160
boolean unique,
161+
boolean declaredAsIndex,
161162
String options,
162163
Selectable[] columns) {
163164
final IndexOrUniqueKeyNameSource source =
164-
new IndexOrUniqueKeyNameSource( context, table, columnNames, originalKeyName );
165+
new IndexOrUniqueKeyNameSource( context, table, columnNames, originalKeyName, declaredAsIndex );
165166
boolean hasFormula = false;
166167
for ( Selectable selectable : columns ) {
167168
if ( selectable.isFormula() ) {
@@ -212,6 +213,7 @@ void bindIndexes(Table table, jakarta.persistence.Index[] indexes) {
212213
columnExpressions,
213214
ordering,
214215
unique,
216+
true,
215217
options,
216218
selectables( table, name, columnExpressions )
217219
);
@@ -230,6 +232,7 @@ void bindUniqueConstraints(Table table, UniqueConstraint[] constraints) {
230232
columnNames,
231233
null,
232234
true,
235+
false,
233236
options,
234237
columns( table, name, columnNames )
235238
);
@@ -255,17 +258,32 @@ else if ( tmp.endsWith( " asc" ) ) {
255258
}
256259
}
257260

258-
private class IndexOrUniqueKeyNameSource implements ImplicitIndexNameSource, ImplicitUniqueKeyNameSource {
261+
private class IndexOrUniqueKeyNameSource
262+
implements ImplicitIndexNameSource, ImplicitUniqueKeyNameSource {
259263
private final MetadataBuildingContext buildingContext;
260264
private final Table table;
261265
private final String[] columnNames;
262266
private final String originalKeyName;
267+
private final boolean declaredAsIndex;
263268

264-
public IndexOrUniqueKeyNameSource(MetadataBuildingContext buildingContext, Table table, String[] columnNames, String originalKeyName) {
269+
private IndexOrUniqueKeyNameSource(
270+
MetadataBuildingContext buildingContext,
271+
Table table,
272+
String[] columnNames,
273+
String originalKeyName,
274+
boolean declaredAsIndex) {
265275
this.buildingContext = buildingContext;
266276
this.table = table;
267277
this.columnNames = columnNames;
268278
this.originalKeyName = originalKeyName;
279+
this.declaredAsIndex = declaredAsIndex;
280+
}
281+
282+
@Override
283+
public Kind kind() {
284+
return declaredAsIndex
285+
? ImplicitIndexNameSource.super.kind()
286+
: ImplicitUniqueKeyNameSource.super.kind();
269287
}
270288

271289
@Override

hibernate-core/src/main/java/org/hibernate/boot/model/naming/ImplicitConstraintNameSource.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,11 @@ public interface ImplicitConstraintNameSource extends ImplicitNameSource {
1515
Identifier getTableName();
1616
List<Identifier> getColumnNames();
1717
Identifier getUserProvidedIdentifier();
18+
Kind kind();
19+
20+
enum Kind {
21+
FOREIGN_KEY,
22+
UNIQUE_KEY,
23+
INDEX
24+
}
1825
}

hibernate-core/src/main/java/org/hibernate/boot/model/naming/ImplicitForeignKeyNameSource.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,9 @@
1212
public interface ImplicitForeignKeyNameSource extends ImplicitConstraintNameSource {
1313
Identifier getReferencedTableName();
1414
List<Identifier> getReferencedColumnNames();
15+
16+
@Override
17+
default Kind kind() {
18+
return Kind.FOREIGN_KEY;
19+
}
1520
}

hibernate-core/src/main/java/org/hibernate/boot/model/naming/ImplicitIndexNameSource.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,8 @@
88
* @author Steve Ebersole
99
*/
1010
public interface ImplicitIndexNameSource extends ImplicitConstraintNameSource {
11+
@Override
12+
default Kind kind() {
13+
return Kind.INDEX;
14+
}
1115
}

hibernate-core/src/main/java/org/hibernate/boot/model/naming/ImplicitNamingStrategyJpaCompliantImpl.java

Lines changed: 53 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.hibernate.HibernateException;
1010
import org.hibernate.boot.model.source.spi.AttributePath;
1111
import org.hibernate.boot.spi.MetadataBuildingContext;
12+
import org.hibernate.engine.jdbc.env.spi.IdentifierHelper;
1213

1314
import static org.hibernate.boot.model.naming.ImplicitJoinColumnNameSource.Nature.ELEMENT_COLLECTION;
1415
import static org.hibernate.internal.util.StringHelper.isNotEmpty;
@@ -191,34 +192,27 @@ public Identifier determineListIndexColumnName(ImplicitIndexColumnNameSource sou
191192
public Identifier determineForeignKeyName(ImplicitForeignKeyNameSource source) {
192193
final Identifier userProvidedIdentifier = source.getUserProvidedIdentifier();
193194
final MetadataBuildingContext buildingContext = source.getBuildingContext();
194-
return userProvidedIdentifier != null ? userProvidedIdentifier : toIdentifier(
195-
NamingHelper.withCharset( buildingContext.getBuildingOptions().getSchemaCharset() )
196-
.generateHashedFkName( "FK", source.getTableName(),
197-
source.getReferencedTableName(), source.getColumnNames() ),
198-
buildingContext
199-
);
195+
return userProvidedIdentifier != null
196+
? userProvidedIdentifier
197+
: generateConstraintName( source, buildingContext );
200198
}
201199

202200
@Override
203201
public Identifier determineUniqueKeyName(ImplicitUniqueKeyNameSource source) {
204202
final Identifier userProvidedIdentifier = source.getUserProvidedIdentifier();
205203
final MetadataBuildingContext buildingContext = source.getBuildingContext();
206-
return userProvidedIdentifier != null ? userProvidedIdentifier : toIdentifier(
207-
NamingHelper.withCharset( buildingContext.getBuildingOptions().getSchemaCharset() )
208-
.generateHashedConstraintName( "UK", source.getTableName(), source.getColumnNames() ),
209-
buildingContext
210-
);
204+
return userProvidedIdentifier != null
205+
? userProvidedIdentifier
206+
: generateConstraintName( source, buildingContext );
211207
}
212208

213209
@Override
214210
public Identifier determineIndexName(ImplicitIndexNameSource source) {
215211
final Identifier userProvidedIdentifier = source.getUserProvidedIdentifier();
216212
final MetadataBuildingContext buildingContext = source.getBuildingContext();
217-
return userProvidedIdentifier != null ? userProvidedIdentifier : toIdentifier(
218-
NamingHelper.withCharset( buildingContext.getBuildingOptions().getSchemaCharset() )
219-
.generateHashedConstraintName( "IDX", source.getTableName(), source.getColumnNames() ),
220-
buildingContext
221-
);
213+
return userProvidedIdentifier != null
214+
? userProvidedIdentifier
215+
: generateConstraintName( source, buildingContext );
222216
}
223217

224218
/**
@@ -235,18 +229,54 @@ protected String transformAttributePath(AttributePath attributePath) {
235229
}
236230

237231
/**
238-
* Easy hook to build an Identifier using the keyword safe IdentifierHelper.
232+
* Easy hook to build an {@link Identifier} using the keyword safe
233+
* {@link org.hibernate.engine.jdbc.env.spi.IdentifierHelper}.
239234
*
240235
* @param stringForm The String form of the name
241-
* @param buildingContext Access to the IdentifierHelper
236+
* @param buildingContext Access to the {@code IdentifierHelper}
242237
*
243238
* @return The identifier
244239
*/
245240
protected Identifier toIdentifier(String stringForm, MetadataBuildingContext buildingContext) {
246-
return buildingContext.getMetadataCollector()
247-
.getDatabase()
248-
.getJdbcEnvironment()
249-
.getIdentifierHelper()
250-
.toIdentifier( stringForm );
241+
return toIdentifier( stringForm,
242+
buildingContext.getMetadataCollector()
243+
.getDatabase()
244+
.getJdbcEnvironment()
245+
.getIdentifierHelper() );
246+
}
247+
248+
/**
249+
* Easy hook to build an {@link Identifier} using the keyword safe
250+
* {@link org.hibernate.engine.jdbc.env.spi.IdentifierHelper}.
251+
*
252+
* @param stringForm The String form of the name
253+
* @param identifierHelper The {@code IdentifierHelper}
254+
*
255+
* @return The identifier
256+
*/
257+
protected Identifier toIdentifier(String stringForm, IdentifierHelper identifierHelper) {
258+
return identifierHelper.toIdentifier( stringForm );
259+
}
260+
261+
protected Identifier generateConstraintName(ImplicitForeignKeyNameSource source, MetadataBuildingContext context) {
262+
return toIdentifier(
263+
NamingHelper.withCharset( context.getBuildingOptions().getSchemaCharset() )
264+
.generateHashedFkName( "FK", source.getTableName(),
265+
source.getReferencedTableName(), source.getColumnNames() ),
266+
context
267+
);
268+
}
269+
270+
protected Identifier generateConstraintName(ImplicitConstraintNameSource source, MetadataBuildingContext context) {
271+
final String prefix = switch (source.kind()) {
272+
case INDEX -> "IDX";
273+
case UNIQUE_KEY -> "UK";
274+
case FOREIGN_KEY -> throw new IllegalArgumentException();
275+
};
276+
return toIdentifier(
277+
NamingHelper.withCharset( context.getBuildingOptions().getSchemaCharset() )
278+
.generateHashedConstraintName( prefix, source.getTableName(), source.getColumnNames() ),
279+
context
280+
);
251281
}
252282
}

hibernate-core/src/main/java/org/hibernate/boot/model/naming/ImplicitUniqueKeyNameSource.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,8 @@
88
* @author Steve Ebersole
99
*/
1010
public interface ImplicitUniqueKeyNameSource extends ImplicitConstraintNameSource {
11-
11+
@Override
12+
default Kind kind() {
13+
return Kind.UNIQUE_KEY;
14+
}
1215
}

0 commit comments

Comments
 (0)