Skip to content

Commit b0aebfa

Browse files
committed
HHH-19389 proper error when @struct is used on Dialect with no support for UDTs
1 parent 2867b99 commit b0aebfa

File tree

5 files changed

+40
-12
lines changed

5 files changed

+40
-12
lines changed

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

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,11 @@ public void doSecondPass(Map<String, PersistentClass> persistentClasses) throws
9090
structName.getCatalogName(),
9191
structName.getSchemaName()
9292
);
93-
final UserDefinedObjectType udt = new UserDefinedObjectType( "orm", namespace, structName.getObjectName() );
93+
if ( !database.getDialect().supportsUserDefinedTypes() ) {
94+
throw new MappingException( "Database does not support user-defined types (remove '@Struct' annotation)" );
95+
}
96+
final UserDefinedObjectType udt =
97+
new UserDefinedObjectType( "orm", namespace, structName.getObjectName() );
9498
final Comment comment = componentClassDetails.getDirectAnnotationUsage( Comment.class );
9599
if ( comment != null ) {
96100
udt.setComment( comment.value() );
@@ -231,17 +235,15 @@ else if ( value instanceof Collection collection ) {
231235
}
232236

233237
private boolean isAggregateArray() {
234-
switch ( component.getAggregateColumn().getSqlTypeCode( context.getMetadataCollector() ) ) {
235-
case SqlTypes.STRUCT_ARRAY:
236-
case SqlTypes.STRUCT_TABLE:
237-
case SqlTypes.JSON_ARRAY:
238-
case SqlTypes.XML_ARRAY:
239-
case SqlTypes.ARRAY:
240-
case SqlTypes.TABLE:
241-
return true;
242-
default:
243-
return false;
244-
}
238+
return switch ( component.getAggregateColumn().getSqlTypeCode( context.getMetadataCollector() ) ) {
239+
case SqlTypes.STRUCT_ARRAY,
240+
SqlTypes.STRUCT_TABLE,
241+
SqlTypes.JSON_ARRAY,
242+
SqlTypes.XML_ARRAY,
243+
SqlTypes.ARRAY,
244+
SqlTypes.TABLE -> true;
245+
default -> false;
246+
};
245247
}
246248

247249
private void orderColumns(UserDefinedObjectType userDefinedType, int[] originalOrder) {

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,11 @@ public int getDefaultDecimalPrecision() {
268268
return 31;
269269
}
270270

271+
@Override
272+
public boolean supportsUserDefinedTypes() {
273+
return true;
274+
}
275+
271276
@Override
272277
protected boolean supportsPredicateAsExpression() {
273278
return getDB2Version().isSameOrAfter( 11 );

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4506,6 +4506,17 @@ public AggregateSupport getAggregateSupport() {
45064506
return AggregateSupportImpl.INSTANCE;
45074507
}
45084508

4509+
/**
4510+
* Does the database support user defined types?
4511+
*
4512+
* @see org.hibernate.annotations.Struct
4513+
*
4514+
* @since 7.1
4515+
*/
4516+
public boolean supportsUserDefinedTypes() {
4517+
return false;
4518+
}
4519+
45094520
/**
45104521
* Does this database have native support for ANSI SQL standard arrays which
45114522
* are expressed in terms of the element type name: {@code integer array}.

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -953,6 +953,11 @@ public boolean supportsBitType() {
953953
return false;
954954
}
955955

956+
@Override
957+
public boolean supportsUserDefinedTypes() {
958+
return true;
959+
}
960+
956961
@Override
957962
public String getArrayTypeName(String javaElementTypeName, String elementTypeName, Integer maxLength) {
958963
return ( javaElementTypeName == null ? elementTypeName : javaElementTypeName ) + "Array";

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1132,6 +1132,11 @@ public int getMaxIdentifierLength() {
11321132
return 63;
11331133
}
11341134

1135+
@Override
1136+
public boolean supportsUserDefinedTypes() {
1137+
return true;
1138+
}
1139+
11351140
@Override
11361141
public boolean supportsStandardArrays() {
11371142
return true;

0 commit comments

Comments
 (0)