Skip to content

Commit 5ecfd2b

Browse files
committed
HHH-19300 constraint interpretation improvements for h2
1 parent c4ebc30 commit 5ecfd2b

File tree

1 file changed

+15
-17
lines changed

1 file changed

+15
-17
lines changed

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

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@
8181

8282
import jakarta.persistence.TemporalType;
8383

84+
import static org.hibernate.exception.spi.TemplatedViolatedConstraintNameExtractor.extractUsingTemplate;
8485
import static org.hibernate.internal.util.JdbcExceptionHelper.extractErrorCode;
8586
import static org.hibernate.query.common.TemporalUnit.SECOND;
8687
import static org.hibernate.type.SqlTypes.BIGINT;
@@ -783,24 +784,21 @@ public ViolatedConstraintNameExtractor getViolatedConstraintNameExtractor() {
783784
}
784785

785786
private static final ViolatedConstraintNameExtractor EXTRACTOR =
786-
new TemplatedViolatedConstraintNameExtractor( sqle -> {
787-
// 23000: Check constraint violation: {0}
788-
// 23001: Unique index or primary key violation: {0}
789-
if ( sqle.getSQLState().startsWith( "23" ) ) {
790-
final String message = sqle.getMessage();
791-
final int i = message.indexOf( "violation: " );
792-
if ( i > 0 ) {
793-
String constraintDescription =
794-
message.substring( i + "violation: ".length() )
795-
.replace( "\"", "" );
796-
if ( sqle.getSQLState().equals( "23506" ) ) {
797-
constraintDescription = constraintDescription.substring( 1, constraintDescription.indexOf( ':' ) );
798-
}
799-
final int j = constraintDescription.indexOf(" ON ");
800-
return j>0 ? constraintDescription.substring(0, j) : constraintDescription;
801-
}
787+
new TemplatedViolatedConstraintNameExtractor( sqle -> switch ( extractErrorCode( sqle ) ) {
788+
case 23505 -> {
789+
// Unique index or primary key violation
790+
final String constraint =
791+
extractUsingTemplate( "violation: \"", "\"", sqle.getMessage() );
792+
final int onIndex = constraint == null ? -1 : constraint.indexOf( " ON " );
793+
yield onIndex > 0 ? constraint.substring( 0, onIndex ) : constraint;
802794
}
803-
return null;
795+
case 23502 ->
796+
// NULL not allowed for column
797+
extractUsingTemplate( "column \"", "\"", sqle.getMessage() );
798+
case 23503, 23506, 23513, 23514 ->
799+
// Referential integrity or check constraint violation
800+
extractUsingTemplate( "constraint violation: \"", ":", sqle.getMessage() );
801+
default -> null;
804802
} );
805803

806804
@Override

0 commit comments

Comments
 (0)