Skip to content

Commit c4ebc30

Browse files
committed
HHH-19300 constraint interpretation improvements for Postgres and MySQL
1 parent 75feac8 commit c4ebc30

File tree

2 files changed

+25
-36
lines changed

2 files changed

+25
-36
lines changed

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

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -970,15 +970,12 @@ public ViolatedConstraintNameExtractor getViolatedConstraintNameExtractor() {
970970
}
971971

972972
private static final ViolatedConstraintNameExtractor EXTRACTOR =
973-
new TemplatedViolatedConstraintNameExtractor( sqle -> {
974-
final String sqlState = extractSqlState( sqle );
975-
if ( sqlState != null ) {
976-
return switch ( parseInt( sqlState ) ) {
977-
case 23000 -> extractUsingTemplate( " for key '", "'", sqle.getMessage() );
978-
default -> null;
979-
};
980-
}
981-
return null;
973+
new TemplatedViolatedConstraintNameExtractor( sqle -> switch ( sqle.getErrorCode() ) {
974+
case 1062 -> extractUsingTemplate( " for key '", "'", sqle.getMessage() );
975+
case 1451, 1452 -> extractUsingTemplate( " CONSTRAINT `", "`", sqle.getMessage() );
976+
case 3819-> extractUsingTemplate( " constraint '", "'", sqle.getMessage() );
977+
case 1048 -> extractUsingTemplate( "Column '", "'", sqle.getMessage() );
978+
default -> null;
982979
} );
983980

984981
@Override
@@ -1259,15 +1256,18 @@ public SQLExceptionConversionDelegate buildSQLExceptionConversionDelegate() {
12591256
case 1048:
12601257
// Null constraint violation
12611258
return new ConstraintViolationException( message, sqlException, sql,
1262-
ConstraintViolationException.ConstraintKind.NOT_NULL, null );
1259+
ConstraintViolationException.ConstraintKind.NOT_NULL,
1260+
getViolatedConstraintNameExtractor().extractConstraintName( sqlException ) );
12631261
case 1451, 1452:
12641262
// Foreign key constraint violation
12651263
return new ConstraintViolationException( message, sqlException, sql,
1266-
ConstraintViolationException.ConstraintKind.FOREIGN_KEY, null );
1264+
ConstraintViolationException.ConstraintKind.FOREIGN_KEY,
1265+
getViolatedConstraintNameExtractor().extractConstraintName( sqlException ) );
12671266
case 3819:
12681267
// Check constraint violation
12691268
return new ConstraintViolationException( message, sqlException, sql,
1270-
ConstraintViolationException.ConstraintKind.CHECK, null );
1269+
ConstraintViolationException.ConstraintKind.CHECK,
1270+
getViolatedConstraintNameExtractor().extractConstraintName( sqlException ) );
12711271
}
12721272

12731273
final String sqlState = extractSqlState( sqlException );

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

Lines changed: 13 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@
4949
import org.hibernate.exception.spi.SQLExceptionConversionDelegate;
5050
import org.hibernate.exception.spi.TemplatedViolatedConstraintNameExtractor;
5151
import org.hibernate.exception.spi.ViolatedConstraintNameExtractor;
52-
import org.hibernate.internal.util.JdbcExceptionHelper;
5352
import org.hibernate.mapping.AggregateColumn;
5453
import org.hibernate.mapping.Table;
5554
import org.hibernate.metamodel.mapping.EntityMappingType;
@@ -105,7 +104,9 @@
105104
import jakarta.persistence.GenerationType;
106105
import jakarta.persistence.TemporalType;
107106

107+
import static java.lang.Integer.parseInt;
108108
import static org.hibernate.exception.spi.TemplatedViolatedConstraintNameExtractor.extractUsingTemplate;
109+
import static org.hibernate.internal.util.JdbcExceptionHelper.extractSqlState;
109110
import static org.hibernate.query.common.TemporalUnit.DAY;
110111
import static org.hibernate.query.common.TemporalUnit.EPOCH;
111112
import static org.hibernate.type.SqlTypes.ARRAY;
@@ -1019,37 +1020,25 @@ public ViolatedConstraintNameExtractor getViolatedConstraintNameExtractor() {
10191020
*/
10201021
private static final ViolatedConstraintNameExtractor EXTRACTOR =
10211022
new TemplatedViolatedConstraintNameExtractor( sqle -> {
1022-
final String sqlState = JdbcExceptionHelper.extractSqlState( sqle );
1023+
final String sqlState = extractSqlState( sqle );
10231024
if ( sqlState != null ) {
1024-
switch ( Integer.parseInt( sqlState ) ) {
1025-
// CHECK VIOLATION
1026-
case 23514:
1027-
return extractUsingTemplate( "violates check constraint \"", "\"", sqle.getMessage() );
1028-
// UNIQUE VIOLATION
1029-
case 23505:
1030-
return extractUsingTemplate( "violates unique constraint \"", "\"", sqle.getMessage() );
1031-
// FOREIGN KEY VIOLATION
1032-
case 23503:
1033-
return extractUsingTemplate( "violates foreign key constraint \"", "\"", sqle.getMessage() );
1034-
// NOT NULL VIOLATION
1035-
case 23502:
1036-
return extractUsingTemplate(
1037-
"null value in column \"",
1038-
"\" violates not-null constraint",
1039-
sqle.getMessage()
1040-
);
1041-
// TODO: RESTRICT VIOLATION
1042-
case 23001:
1043-
return null;
1044-
}
1025+
return switch ( parseInt( sqlState ) ) {
1026+
case 23505, 23514, 23503 ->
1027+
// UNIQUE, CHECK, OR FOREIGN KEY VIOLATION
1028+
extractUsingTemplate( "constraint \"", "\"", sqle.getMessage() );
1029+
case 23502 ->
1030+
// NOT NULL VIOLATION
1031+
extractUsingTemplate( "column \"", "\"", sqle.getMessage() );
1032+
default -> null;
1033+
};
10451034
}
10461035
return null;
10471036
} );
10481037

10491038
@Override
10501039
public SQLExceptionConversionDelegate buildSQLExceptionConversionDelegate() {
10511040
return (sqlException, message, sql) -> {
1052-
final String sqlState = JdbcExceptionHelper.extractSqlState( sqlException );
1041+
final String sqlState = extractSqlState( sqlException );
10531042
if ( sqlState != null ) {
10541043
switch ( sqlState ) {
10551044
case "40P01":

0 commit comments

Comments
 (0)