mirror of
https://github.com/hibernate/hibernate-orm
synced 2025-02-10 13:14:50 +00:00
HHH-15797 better error messages
1. include the SQL in some SQLGrammarExceptions where it was missing 2. append the SQL to the error message in JDBCException 3. don't wrap HibernateException in PersistenceException b/c it is one already
This commit is contained in:
parent
239dfa30fa
commit
cb35e0e734
@ -64,7 +64,7 @@ public void test() {
|
||||
fail("Should fail because the ISBN is not of the right length!");
|
||||
}
|
||||
catch (PersistenceException e) {
|
||||
assertEquals(ConstraintViolationException.class, e.getCause().getCause().getClass());
|
||||
assertEquals(ConstraintViolationException.class, e.getCause().getClass());
|
||||
}
|
||||
try {
|
||||
doInJPA(this::entityManagerFactory, entityManager -> {
|
||||
@ -78,7 +78,7 @@ public void test() {
|
||||
fail("Should fail because the code is 0!");
|
||||
}
|
||||
catch (PersistenceException e) {
|
||||
assertEquals(ConstraintViolationException.class, e.getCause().getCause().getClass());
|
||||
assertEquals(ConstraintViolationException.class, e.getCause().getClass());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -473,7 +473,7 @@ public void test_sql_jpa_multi_entity_query_example() {
|
||||
fail("Should throw NonUniqueDiscoveredSqlAliasException!");
|
||||
}
|
||||
catch (PersistenceException expected) {
|
||||
assertEquals(NonUniqueDiscoveredSqlAliasException.class, expected.getCause().getClass());
|
||||
assertEquals(NonUniqueDiscoveredSqlAliasException.class, expected.getClass());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -17,27 +17,32 @@
|
||||
*/
|
||||
public class JDBCException extends HibernateException {
|
||||
private final SQLException sqlException;
|
||||
private final String message;
|
||||
private final String sql;
|
||||
|
||||
/**
|
||||
* Constructs a JDBCException using the given information.
|
||||
* Constructs a {@code JDBCException} using the given information.
|
||||
*
|
||||
* @param message The message explaining the exception condition
|
||||
* @param cause The underlying cause
|
||||
*/
|
||||
public JDBCException(String message, SQLException cause) {
|
||||
this( message, cause, null );
|
||||
super( message, cause );
|
||||
this.message = message;
|
||||
this.sqlException = cause;
|
||||
this.sql = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a JDBCException using the given information.
|
||||
* Constructs a {@code JDBCException} using the given information.
|
||||
*
|
||||
* @param message The message explaining the exception condition
|
||||
* @param cause The underlying cause
|
||||
* @param sql The sql being executed when the exception occurred
|
||||
*/
|
||||
public JDBCException(String message, SQLException cause, String sql) {
|
||||
super( message, cause );
|
||||
super( message + " [" + sql + "]", cause );
|
||||
this.message = message;
|
||||
this.sqlException = cause;
|
||||
this.sql = sql;
|
||||
}
|
||||
@ -82,4 +87,10 @@ public String getSQL() {
|
||||
return sql;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The error message without the SQL statement appended
|
||||
*/
|
||||
public String getErrorMessage() {
|
||||
return message;
|
||||
}
|
||||
}
|
||||
|
@ -47,7 +47,8 @@ public void render(
|
||||
final SqlAstNode argument = arguments.get( i );
|
||||
final int paramIndex = sqlFragment.indexOf( '?', index );
|
||||
if ( paramIndex == -1 ) {
|
||||
throw new IllegalArgumentException( "The SQL function passes an argument at index " + i + " but the fragment contains no placeholder for the argument: " + sqlFragment );
|
||||
throw new IllegalArgumentException( "The SQL function passes an argument at index " + i
|
||||
+ " but the fragment contains no placeholder for the argument: " + sqlFragment );
|
||||
}
|
||||
sqlAppender.append( sqlFragment, index, paramIndex );
|
||||
argument.accept( walker );
|
||||
|
@ -90,7 +90,7 @@ public void lock(Object id, Object version, Object object, int timeout, EventSou
|
||||
lockable.getVersionType().nullSafeSet( st, version, offset, session );
|
||||
}
|
||||
|
||||
final int affected = jdbcCoordinator.getResultSetReturn().executeUpdate( st );
|
||||
final int affected = jdbcCoordinator.getResultSetReturn().executeUpdate( st, sql );
|
||||
// todo: should this instead check for exactly one row modified?
|
||||
if ( affected < 0 ) {
|
||||
final StatisticsImplementor statistics = factory.getStatistics();
|
||||
|
@ -89,7 +89,7 @@ public void lock(Object id, Object version, Object object, int timeout, EventSou
|
||||
lockable.getVersionType().nullSafeSet( st, version, offset, session );
|
||||
}
|
||||
|
||||
final int affected = jdbcCoordinator.getResultSetReturn().executeUpdate( st );
|
||||
final int affected = jdbcCoordinator.getResultSetReturn().executeUpdate( st, sql );
|
||||
// todo: should this instead check for exactly one row modified?
|
||||
if ( affected < 0 ) {
|
||||
final StatisticsImplementor statistics = factory.getStatistics();
|
||||
|
@ -96,7 +96,7 @@ public void lock(
|
||||
lockableVersionType.nullSafeSet( st, version, offset, session );
|
||||
}
|
||||
|
||||
final int affected = jdbcCoordinator.getResultSetReturn().executeUpdate( st );
|
||||
final int affected = jdbcCoordinator.getResultSetReturn().executeUpdate( st, sql );
|
||||
if ( affected < 0 ) {
|
||||
final StatisticsImplementor statistics = factory.getStatistics();
|
||||
if ( statistics.isStatisticsEnabled() ) {
|
||||
|
@ -160,7 +160,7 @@ public static void cleanTemporaryTableRows(
|
||||
ps.setString( 1, sessionUid );
|
||||
}
|
||||
|
||||
session.getJdbcCoordinator().getResultSetReturn().executeUpdate( ps );
|
||||
session.getJdbcCoordinator().getResultSetReturn().executeUpdate( ps, sql );
|
||||
}
|
||||
catch( Throwable t ) {
|
||||
log.unableToCleanupTemporaryIdTable(t);
|
||||
|
@ -68,6 +68,31 @@ public ResultSet extract(PreparedStatement statement) {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResultSet extract(PreparedStatement statement, String sql) {
|
||||
// IMPL NOTE : SQL logged by caller
|
||||
long executeStartNanos = 0;
|
||||
if ( this.sqlStatementLogger.getLogSlowQuery() > 0 ) {
|
||||
executeStartNanos = System.nanoTime();
|
||||
}
|
||||
try {
|
||||
final ResultSet rs;
|
||||
try {
|
||||
jdbcExecuteStatementStart();
|
||||
rs = statement.executeQuery();
|
||||
}
|
||||
finally {
|
||||
jdbcExecuteStatementEnd();
|
||||
sqlStatementLogger.logSlowQuery( sql, executeStartNanos );
|
||||
}
|
||||
postExtract( rs, statement );
|
||||
return rs;
|
||||
}
|
||||
catch (SQLException e) {
|
||||
throw sqlExceptionHelper.convert( e, "could not extract ResultSet", sql );
|
||||
}
|
||||
}
|
||||
|
||||
private void jdbcExecuteStatementEnd() {
|
||||
jdbcCoordinator.getJdbcSessionOwner().getJdbcSessionContext().getObserver().jdbcExecuteStatementEnd();
|
||||
}
|
||||
@ -122,7 +147,7 @@ public ResultSet extract(Statement statement, String sql) {
|
||||
return rs;
|
||||
}
|
||||
catch (SQLException e) {
|
||||
throw sqlExceptionHelper.convert( e, "could not extract ResultSet" );
|
||||
throw sqlExceptionHelper.convert( e, "could not extract ResultSet", sql );
|
||||
}
|
||||
}
|
||||
|
||||
@ -156,6 +181,36 @@ public ResultSet execute(PreparedStatement statement) {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResultSet execute(PreparedStatement statement, String sql) {
|
||||
// sql logged by StatementPreparerImpl
|
||||
long executeStartNanos = 0;
|
||||
if ( this.sqlStatementLogger.getLogSlowQuery() > 0 ) {
|
||||
executeStartNanos = System.nanoTime();
|
||||
}
|
||||
try {
|
||||
final ResultSet rs;
|
||||
try {
|
||||
jdbcExecuteStatementStart();
|
||||
if ( !statement.execute() ) {
|
||||
while ( !statement.getMoreResults() && statement.getUpdateCount() != -1 ) {
|
||||
// do nothing until we hit the resultset
|
||||
}
|
||||
}
|
||||
rs = statement.getResultSet();
|
||||
}
|
||||
finally {
|
||||
jdbcExecuteStatementEnd();
|
||||
sqlStatementLogger.logSlowQuery( sql, executeStartNanos );
|
||||
}
|
||||
postExtract( rs, statement );
|
||||
return rs;
|
||||
}
|
||||
catch (SQLException e) {
|
||||
throw sqlExceptionHelper.convert( e, "could not execute statement", sql );
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResultSet execute(Statement statement, String sql) {
|
||||
sqlStatementLogger.logStatement( sql );
|
||||
@ -176,13 +231,13 @@ public ResultSet execute(Statement statement, String sql) {
|
||||
}
|
||||
finally {
|
||||
jdbcExecuteStatementEnd();
|
||||
sqlStatementLogger.logSlowQuery( statement, executeStartNanos );
|
||||
sqlStatementLogger.logSlowQuery( sql, executeStartNanos );
|
||||
}
|
||||
postExtract( rs, statement );
|
||||
return rs;
|
||||
}
|
||||
catch (SQLException e) {
|
||||
throw sqlExceptionHelper.convert( e, "could not execute statement" );
|
||||
throw sqlExceptionHelper.convert( e, "could not execute statement", sql );
|
||||
}
|
||||
}
|
||||
|
||||
@ -207,6 +262,27 @@ public int executeUpdate(PreparedStatement statement) {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int executeUpdate(PreparedStatement statement, String sql) {
|
||||
assert statement != null;
|
||||
|
||||
long executeStartNanos = 0;
|
||||
if ( this.sqlStatementLogger.getLogSlowQuery() > 0 ) {
|
||||
executeStartNanos = System.nanoTime();
|
||||
}
|
||||
try {
|
||||
jdbcExecuteStatementStart();
|
||||
return statement.executeUpdate();
|
||||
}
|
||||
catch (SQLException e) {
|
||||
throw sqlExceptionHelper.convert( e, "could not execute statement", sql );
|
||||
}
|
||||
finally {
|
||||
jdbcExecuteStatementEnd();
|
||||
sqlStatementLogger.logSlowQuery( sql, executeStartNanos );
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int executeUpdate(Statement statement, String sql) {
|
||||
sqlStatementLogger.logStatement( sql );
|
||||
@ -219,11 +295,11 @@ public int executeUpdate(Statement statement, String sql) {
|
||||
return statement.executeUpdate( sql );
|
||||
}
|
||||
catch (SQLException e) {
|
||||
throw sqlExceptionHelper.convert( e, "could not execute statement" );
|
||||
throw sqlExceptionHelper.convert( e, "could not execute statement", sql );
|
||||
}
|
||||
finally {
|
||||
jdbcExecuteStatementEnd();
|
||||
sqlStatementLogger.logSlowQuery( statement, executeStartNanos );
|
||||
sqlStatementLogger.logSlowQuery( sql, executeStartNanos );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -95,7 +95,7 @@ protected void performNonBatchedMutation(
|
||||
try {
|
||||
final int affectedRowCount = session.getJdbcCoordinator()
|
||||
.getResultSetReturn()
|
||||
.executeUpdate( statementDetails.getStatement() );
|
||||
.executeUpdate( statementDetails.getStatement(), statementDetails.getSqlString() );
|
||||
|
||||
if ( affectedRowCount == 0 && tableDetails.isOptional() ) {
|
||||
// the optional table did not have a row
|
||||
|
@ -207,7 +207,7 @@ private void executeWithId(
|
||||
try {
|
||||
final int affectedRowCount = session.getJdbcCoordinator()
|
||||
.getResultSetReturn()
|
||||
.executeUpdate( statementDetails.getStatement() );
|
||||
.executeUpdate( statementDetails.getStatement(), statementDetails.getSqlString() );
|
||||
|
||||
ModelMutationHelper.checkResults( resultChecker, statementDetails, affectedRowCount, -1 );
|
||||
}
|
||||
|
@ -12,86 +12,116 @@
|
||||
import java.sql.Statement;
|
||||
|
||||
/**
|
||||
* Contract for extracting ResultSets from Statements, executing Statements,
|
||||
* managing Statement/ResultSet resources, and logging statement calls.
|
||||
*
|
||||
* TODO: This could eventually utilize the new Return interface. It would be
|
||||
* great to have a common API shared.
|
||||
* Contract for extracting {@link ResultSet}s from {@link Statement}s, executing the statements,
|
||||
* managing resources, and logging statement calls.
|
||||
* Generally the methods here for dealing with {@link CallableStatement} are extremely limited
|
||||
*
|
||||
* Generally the methods here dealing with CallableStatement are extremely limited, relying on the legacy
|
||||
*
|
||||
*
|
||||
* @author Brett Meyer
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
//TODO: This could eventually utilize the new Return interface. It would be great to have a common API.
|
||||
public interface ResultSetReturn {
|
||||
|
||||
|
||||
/**
|
||||
* Extract the ResultSet from the PreparedStatement.
|
||||
* Extract the {@link ResultSet} from the {@link PreparedStatement}.
|
||||
* <p>
|
||||
* If user passes {@link CallableStatement} reference, this method calls {@link #extract(CallableStatement)}
|
||||
* internally. Otherwise, generally speaking, {@link PreparedStatement#executeQuery()} is called
|
||||
* If client passes {@link CallableStatement} reference, this method calls {@link #extract(CallableStatement)}
|
||||
* internally. Otherwise, {@link PreparedStatement#executeQuery()} is called.
|
||||
*
|
||||
* @param statement The PreparedStatement from which to extract the ResultSet
|
||||
* @param statement The {@link PreparedStatement} from which to extract the {@link ResultSet}
|
||||
*
|
||||
* @return The extracted ResultSet
|
||||
*/
|
||||
ResultSet extract(PreparedStatement statement);
|
||||
|
||||
|
||||
/**
|
||||
* Extract the ResultSet from the CallableStatement. Note that this is the limited legacy form which delegates to
|
||||
* {@link org.hibernate.dialect.Dialect#getResultSet}. Better option is to integrate
|
||||
* Extract the {@link ResultSet} from the {@link PreparedStatement}.
|
||||
* <p>
|
||||
* If client passes {@link CallableStatement} reference, this method calls {@link #extract(CallableStatement)}
|
||||
* internally. Otherwise, {@link PreparedStatement#executeQuery()} is called.
|
||||
*
|
||||
* @param statement The {@link PreparedStatement} from which to extract the {@link ResultSet}
|
||||
*
|
||||
* @return The extracted {@link ResultSet}
|
||||
*/
|
||||
ResultSet extract(PreparedStatement statement, String sql);
|
||||
|
||||
/**
|
||||
* Extract the {@link ResultSet} from the {@link CallableStatement}. Note that this is the limited legacy
|
||||
* form which delegates to {@link org.hibernate.dialect.Dialect#getResultSet}. Better option is to integrate
|
||||
* {@link org.hibernate.procedure.ProcedureCall}-like hooks
|
||||
*
|
||||
* @param callableStatement The CallableStatement from which to extract the ResultSet
|
||||
* @param callableStatement The {@link CallableStatement} from which to extract the {@link ResultSet}
|
||||
*
|
||||
* @return The extracted ResultSet
|
||||
* @return The extracted {@link ResultSet}
|
||||
*/
|
||||
ResultSet extract(CallableStatement callableStatement);
|
||||
|
||||
/**
|
||||
* Performs the given SQL statement, expecting a ResultSet in return
|
||||
* Performs the given SQL statement, expecting a {@link ResultSet} in return
|
||||
*
|
||||
* @param statement The JDBC Statement object to use
|
||||
* @param statement The JDBC {@link Statement} object to use
|
||||
* @param sql The SQL to execute
|
||||
*
|
||||
* @return The resulting ResultSet
|
||||
* @return The resulting {@link ResultSet}
|
||||
*/
|
||||
ResultSet extract(Statement statement, String sql);
|
||||
|
||||
/**
|
||||
* Execute the PreparedStatement return its first ResultSet, if any. If there is no ResultSet, returns {@code null}
|
||||
* Execute the {@link PreparedStatement} return its first {@link ResultSet}, if any.
|
||||
* If there is no {@link ResultSet}, returns {@code null}
|
||||
*
|
||||
* @param statement The PreparedStatement to execute
|
||||
* @param statement The {@link PreparedStatement} to execute
|
||||
*
|
||||
* @return The extracted ResultSet, or {@code null}
|
||||
* @return The extracted {@link ResultSet}, or {@code null}
|
||||
*/
|
||||
ResultSet execute(PreparedStatement statement);
|
||||
|
||||
|
||||
/**
|
||||
* Performs the given SQL statement, returning its first ResultSet, if any. If there is no ResultSet,
|
||||
* returns {@code null}
|
||||
* Execute the {@link PreparedStatement} return its first {@link ResultSet}, if any.
|
||||
* If there is no {@link ResultSet}, returns {@code null}
|
||||
*
|
||||
* @param statement The JDBC Statement object to use
|
||||
* @param statement The {@link PreparedStatement} to execute
|
||||
* @param sql For error reporting
|
||||
*
|
||||
* @return The extracted {@link ResultSet}, or {@code null}
|
||||
*/
|
||||
ResultSet execute(PreparedStatement statement, String sql);
|
||||
|
||||
/**
|
||||
* Performs the given SQL statement, returning its first {@link ResultSet}, if any.
|
||||
* If there is no {@link ResultSet}, returns {@code null}
|
||||
*
|
||||
* @param statement The JDBC {@link Statement} object to use
|
||||
* @param sql The SQL to execute
|
||||
*
|
||||
* @return The extracted ResultSet, or {@code null}
|
||||
* @return The extracted {@link ResultSet}, or {@code null}
|
||||
*/
|
||||
ResultSet execute(Statement statement, String sql);
|
||||
|
||||
/**
|
||||
* Execute the PreparedStatement, returning its "affected row count".
|
||||
* Execute the {@link PreparedStatement}, returning its "affected row count".
|
||||
*
|
||||
* @param statement The PreparedStatement to execute
|
||||
* @param statement The {@link PreparedStatement} to execute
|
||||
*
|
||||
* @return The {@link PreparedStatement#executeUpdate()} result
|
||||
*/
|
||||
int executeUpdate(PreparedStatement statement);
|
||||
|
||||
/**
|
||||
* Execute the {@link PreparedStatement}, returning its "affected row count".
|
||||
*
|
||||
* @param statement The {@link PreparedStatement} to execute
|
||||
* @param sql For error reporting
|
||||
*
|
||||
* @return The {@link PreparedStatement#executeUpdate()} result
|
||||
*/
|
||||
int executeUpdate(PreparedStatement statement, String sql);
|
||||
|
||||
/**
|
||||
* Execute the given SQL statement returning its "affected row count".
|
||||
*
|
||||
* @param statement The JDBC Statement object to use
|
||||
* @param statement The JDBC {@link Statement} object to use
|
||||
* @param sql The SQL to execute
|
||||
*
|
||||
* @return The {@link PreparedStatement#executeUpdate(String)} result
|
||||
|
@ -10,8 +10,8 @@
|
||||
import org.hibernate.JDBCException;
|
||||
|
||||
/**
|
||||
* Implementation of JDBCException indicating that the SQL sent to the database
|
||||
* server was invalid (syntax error, invalid object references, etc).
|
||||
* Specialization of {@link JDBCException} indicating that the SQL sent to the
|
||||
* database server was invalid (syntax error, invalid object references, etc).
|
||||
*
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
|
@ -108,8 +108,8 @@ private Timestamp getCurrentTimestamp(SharedSessionContractImplementor session)
|
||||
try {
|
||||
statement = prepareStatement( coordinator, timestampSelectString, callable );
|
||||
Timestamp ts = callable
|
||||
? extractCalledResult( statement, coordinator )
|
||||
: extractResult( statement, coordinator );
|
||||
? extractCalledResult( statement, coordinator, timestampSelectString )
|
||||
: extractResult( statement, coordinator, timestampSelectString );
|
||||
logResult( ts );
|
||||
return ts;
|
||||
}
|
||||
@ -135,16 +135,18 @@ private static PreparedStatement prepareStatement(
|
||||
return coordinator.getStatementPreparer().prepareStatement( timestampSelectString, callable );
|
||||
}
|
||||
|
||||
private static Timestamp extractResult(PreparedStatement statement, JdbcCoordinator coordinator) throws SQLException {
|
||||
ResultSet resultSet = coordinator.getResultSetReturn().extract( statement );
|
||||
private static Timestamp extractResult(PreparedStatement statement, JdbcCoordinator coordinator, String sql)
|
||||
throws SQLException {
|
||||
ResultSet resultSet = coordinator.getResultSetReturn().extract( statement, sql );
|
||||
resultSet.next();
|
||||
return resultSet.getTimestamp( 1 );
|
||||
}
|
||||
|
||||
private static Timestamp extractCalledResult(PreparedStatement statement, JdbcCoordinator coordinator) throws SQLException {
|
||||
private static Timestamp extractCalledResult(PreparedStatement statement, JdbcCoordinator coordinator, String sql)
|
||||
throws SQLException {
|
||||
CallableStatement callable = (CallableStatement) statement;
|
||||
callable.registerOutParameter( 1, TIMESTAMP );
|
||||
coordinator.getResultSetReturn().execute( callable );
|
||||
coordinator.getResultSetReturn().execute( callable, sql );
|
||||
return callable.getTimestamp( 1 );
|
||||
}
|
||||
|
||||
|
@ -25,7 +25,6 @@
|
||||
import org.hibernate.internal.CoreLogging;
|
||||
import org.hibernate.internal.CoreMessageLogger;
|
||||
import org.hibernate.internal.util.StringHelper;
|
||||
import org.hibernate.mapping.Table;
|
||||
import org.hibernate.service.ServiceRegistry;
|
||||
import org.hibernate.type.Type;
|
||||
|
||||
|
@ -72,7 +72,8 @@ public Object performInsert(
|
||||
jdbcServices.getSqlStatementLogger().logStatement( insertStatementDetails.getSqlString() );
|
||||
jdbcValueBindings.beforeStatement( insertStatementDetails, session );
|
||||
|
||||
jdbcCoordinator.getResultSetReturn().executeUpdate( insertStatementDetails.resolveStatement() );
|
||||
jdbcCoordinator.getResultSetReturn()
|
||||
.executeUpdate( insertStatementDetails.resolveStatement(), insertStatementDetails.getSqlString() );
|
||||
|
||||
// the insert is complete, select the generated id...
|
||||
|
||||
@ -115,7 +116,7 @@ public final Object performInsert(String insertSQL, SharedSessionContractImpleme
|
||||
PreparedStatement insert = statementPreparer.prepareStatement( insertSQL, NO_GENERATED_KEYS );
|
||||
try {
|
||||
binder.bindValues( insert );
|
||||
jdbcCoordinator.getResultSetReturn().executeUpdate( insert );
|
||||
jdbcCoordinator.getResultSetReturn().executeUpdate( insert, insertSQL );
|
||||
}
|
||||
finally {
|
||||
jdbcCoordinator.getLogicalConnection().getResourceRegistry().release( insert );
|
||||
|
@ -99,7 +99,7 @@ public Object performInsert(
|
||||
jdbcValueBindings.beforeStatement( insertStatementDetails, session );
|
||||
|
||||
try {
|
||||
jdbcCoordinator.getResultSetReturn().executeUpdate( insertStatement );
|
||||
jdbcCoordinator.getResultSetReturn().executeUpdate( insertStatement, insertSql );
|
||||
|
||||
try {
|
||||
final ResultSet resultSet = insertStatement.getGeneratedKeys();
|
||||
@ -147,7 +147,7 @@ public Object executeAndExtract(
|
||||
final JdbcCoordinator jdbcCoordinator = session.getJdbcCoordinator();
|
||||
final JdbcServices jdbcServices = session.getJdbcServices();
|
||||
|
||||
jdbcCoordinator.getResultSetReturn().executeUpdate( insertStatement );
|
||||
jdbcCoordinator.getResultSetReturn().executeUpdate( insertStatement, insertSql );
|
||||
|
||||
try {
|
||||
final ResultSet resultSet = insertStatement.getGeneratedKeys();
|
||||
|
@ -66,7 +66,7 @@ protected Object executeAndExtract(
|
||||
final JdbcCoordinator jdbcCoordinator = session.getJdbcCoordinator();
|
||||
final JdbcServices jdbcServices = session.getJdbcServices();
|
||||
|
||||
final ResultSet resultSet = jdbcCoordinator.getResultSetReturn().execute( insertStatement );
|
||||
final ResultSet resultSet = jdbcCoordinator.getResultSetReturn().execute( insertStatement, insertSql );
|
||||
try {
|
||||
return getGeneratedIdentity( persister.getNavigableRole().getFullPath(), resultSet, persister, session );
|
||||
}
|
||||
|
@ -152,9 +152,8 @@ else if ( exception instanceof TransientObjectException ) {
|
||||
return new IllegalStateException( exception );
|
||||
}
|
||||
else {
|
||||
final PersistenceException converted = new PersistenceException( exception.getMessage(), exception );
|
||||
rollbackIfNecessary( converted );
|
||||
return converted;
|
||||
rollbackIfNecessary( exception );
|
||||
return exception;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -177,9 +177,8 @@ private void performDelete(JdbcValueBindings jdbcValueBindings, SharedSessionCon
|
||||
|
||||
bindKeyValues( jdbcValueBindings, deleteStatement, jdbcDelete, session );
|
||||
|
||||
session.getJdbcCoordinator()
|
||||
.getResultSetReturn()
|
||||
.executeUpdate( deleteStatement );
|
||||
session.getJdbcCoordinator().getResultSetReturn()
|
||||
.executeUpdate( deleteStatement, jdbcDelete.getSqlString() );
|
||||
}
|
||||
|
||||
private void bindKeyValues(
|
||||
@ -346,14 +345,12 @@ private boolean performUpdate(
|
||||
try {
|
||||
final PreparedStatement updateStatement = statementDetails.resolveStatement();
|
||||
|
||||
final SqlStatementLogger sqlStatementLogger = session.getJdbcServices().getSqlStatementLogger();
|
||||
sqlStatementLogger.logStatement( statementDetails.getSqlString() );
|
||||
session.getJdbcServices().getSqlStatementLogger().logStatement( statementDetails.getSqlString() );
|
||||
|
||||
jdbcValueBindings.beforeStatement( statementDetails, session );
|
||||
|
||||
final int rowCount = session.getJdbcCoordinator()
|
||||
.getResultSetReturn()
|
||||
.executeUpdate( updateStatement );
|
||||
final int rowCount = session.getJdbcCoordinator().getResultSetReturn()
|
||||
.executeUpdate( updateStatement, statementDetails.getSqlString() );
|
||||
|
||||
if ( rowCount == 0 ) {
|
||||
return false;
|
||||
@ -406,9 +403,8 @@ private void performInsert(JdbcValueBindings jdbcValueBindings, SharedSessionCon
|
||||
} );
|
||||
}
|
||||
|
||||
session.getJdbcCoordinator()
|
||||
.getResultSetReturn()
|
||||
.executeUpdate( insertStatement );
|
||||
session.getJdbcCoordinator().getResultSetReturn()
|
||||
.executeUpdate( insertStatement, jdbcInsert.getSqlString() );
|
||||
}
|
||||
finally {
|
||||
session.getJdbcCoordinator().getLogicalConnection().getResourceRegistry().release( insertStatement );
|
||||
|
@ -58,7 +58,7 @@ public void testWithoutIntegrator() {
|
||||
assertEquals( new BigDecimal( "100" ), inv.getInvestments().get( 0 ).getAmount().getAmount() );
|
||||
}
|
||||
catch (PersistenceException e) {
|
||||
assertTyping( JDBCException.class, e.getCause() );
|
||||
assertTyping( JDBCException.class, e );
|
||||
sess.getTransaction().rollback();
|
||||
}
|
||||
finally {
|
||||
|
@ -66,10 +66,10 @@ public void testBulkUpdate(){
|
||||
fail("Should throw PersistenceException");
|
||||
}
|
||||
catch (PersistenceException e) {
|
||||
assertTrue( e.getCause() instanceof HibernateException );
|
||||
assertTrue( e instanceof HibernateException );
|
||||
assertEquals(
|
||||
"The query: [update Country set name = :name] attempts to update an immutable entity: [Country]",
|
||||
e.getCause().getMessage()
|
||||
e.getMessage()
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -176,7 +176,7 @@ public void testUniqueConstaintOnSecondaryTable() {
|
||||
}
|
||||
catch (PersistenceException e) {
|
||||
try {
|
||||
assertTyping( ConstraintViolationException.class, e.getCause() );
|
||||
assertTyping( ConstraintViolationException.class, e );
|
||||
//success
|
||||
}
|
||||
finally {
|
||||
|
@ -184,7 +184,7 @@ public void testUnidirectionalDefault() throws Exception {
|
||||
}
|
||||
catch (PersistenceException ce) {
|
||||
try {
|
||||
assertTyping( ConstraintViolationException.class, ce.getCause() );
|
||||
assertTyping( ConstraintViolationException.class, ce );
|
||||
//success
|
||||
|
||||
}
|
||||
|
@ -45,7 +45,7 @@ public void testBidirForeignIdGenerator() {
|
||||
} );
|
||||
}
|
||||
catch (PersistenceException ex) {
|
||||
assertTyping( IdentifierGenerationException.class, ex.getCause() );
|
||||
assertTyping( IdentifierGenerationException.class, ex );
|
||||
// expected
|
||||
}
|
||||
}
|
||||
|
@ -44,7 +44,7 @@ public void testNullBidirForeignIdGenerator() {
|
||||
fail( "should have thrown IdentifierGenerationException.");
|
||||
}
|
||||
catch (PersistenceException ex) {
|
||||
assertTyping(IdentifierGenerationException.class, ex.getCause());
|
||||
assertTyping(IdentifierGenerationException.class, ex);
|
||||
// expected
|
||||
}
|
||||
finally {
|
||||
@ -68,7 +68,7 @@ public void testNotFoundBidirForeignIdGenerator() {
|
||||
fail( "should have thrown IdentifierGenerationException.");
|
||||
}
|
||||
catch (PersistenceException ex) {
|
||||
assertTyping(IdentifierGenerationException.class, ex.getCause());
|
||||
assertTyping(IdentifierGenerationException.class, ex);
|
||||
// expected
|
||||
}
|
||||
finally {
|
||||
|
@ -84,7 +84,7 @@ public void testConstraintsOnSuperclassProperties(SessionFactoryScope scope) {
|
||||
fail( "Database Exception not handled" );
|
||||
}
|
||||
catch (PersistenceException e) {
|
||||
assertTyping( JDBCException.class, e.getCause() );
|
||||
assertTyping( JDBCException.class, e );
|
||||
//success
|
||||
}
|
||||
}
|
||||
|
@ -62,7 +62,7 @@ public void testUniquenessConstraintWithSuperclassProperty() {
|
||||
fail( "Database constraint non-existent" );
|
||||
}
|
||||
catch (PersistenceException e) {
|
||||
assertTyping( JDBCException.class, e.getCause() );
|
||||
assertTyping( JDBCException.class, e );
|
||||
//success
|
||||
}
|
||||
finally {
|
||||
|
@ -54,7 +54,7 @@ public void testUniqueConstraintWithEmptyColumnName() {
|
||||
catch ( PersistenceException e ) {
|
||||
assertEquals(
|
||||
ConstraintViolationException.class,
|
||||
e.getCause().getClass()
|
||||
e.getClass()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -34,8 +34,8 @@ public void onConstraintViolationOnSaveAndSaveOrUpdate(RuntimeException e) {
|
||||
@Override
|
||||
public void onConstraintViolationOnPersistAndMergeAndFlush(RuntimeException e) {
|
||||
assertThat( e, instanceOf( PersistenceException.class ) );
|
||||
assertThat( e.getCause(), instanceOf( ConstraintViolationException.class ) );
|
||||
assertThat( e.getCause().getCause(), instanceOf( SQLException.class ) );
|
||||
assertThat( e, instanceOf( ConstraintViolationException.class ) );
|
||||
assertThat( e.getCause(), instanceOf( SQLException.class ) );
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -79,7 +79,7 @@ public void onStaleObjectMergeAndUpdateFlush(RuntimeException e) {
|
||||
@Override
|
||||
public void onIdentifierGeneratorFailure(RuntimeException e) {
|
||||
assertThat( e, instanceOf( PersistenceException.class ) );
|
||||
assertThat( e.getCause(), instanceOf( IdentifierGenerationException.class ) );
|
||||
assertThat( e, instanceOf( IdentifierGenerationException.class ) );
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -90,21 +90,21 @@ public void onTransactionExceptionOnSaveAndSaveOrUpdate(RuntimeException e) {
|
||||
@Override
|
||||
public void onTransactionExceptionOnPersistAndMergeAndFlush(RuntimeException e) {
|
||||
assertThat( e, instanceOf( PersistenceException.class ) );
|
||||
assertThat( e.getCause(), instanceOf( TransactionException.class ) );
|
||||
assertThat( e, instanceOf( TransactionException.class ) );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTransactionExceptionOnCommit(RuntimeException e) {
|
||||
assertThat( e, instanceOf( RollbackException.class ) );
|
||||
assertThat( e.getCause(), instanceOf( PersistenceException.class ) );
|
||||
assertThat( e.getCause().getCause(), instanceOf( TransactionException.class ) );
|
||||
assertThat( e, instanceOf( PersistenceException.class ) );
|
||||
assertThat( e.getCause(), instanceOf( TransactionException.class ) );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onExecuteUpdateWithConstraintViolation(RuntimeException e) {
|
||||
assertThat( e, instanceOf( PersistenceException.class ) );
|
||||
assertThat( e.getCause(), instanceOf( ConstraintViolationException.class ) );
|
||||
assertThat( e.getCause().getCause(), instanceOf( SQLException.class ) );
|
||||
assertThat( e, instanceOf( ConstraintViolationException.class ) );
|
||||
assertThat( e.getCause(), instanceOf( SQLException.class ) );
|
||||
}
|
||||
};
|
||||
}
|
||||
@ -114,13 +114,13 @@ static ExceptionExpectations nativePre52() {
|
||||
@Override
|
||||
public void onConstraintViolationOnSaveAndSaveOrUpdate(RuntimeException e) {
|
||||
assertThat( e, instanceOf( ConstraintViolationException.class ) );
|
||||
assertThat( e.getCause(), instanceOf( SQLException.class ) );
|
||||
assertThat( e, instanceOf( SQLException.class ) );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConstraintViolationOnPersistAndMergeAndFlush(RuntimeException e) {
|
||||
assertThat( e, instanceOf( ConstraintViolationException.class ) );
|
||||
assertThat( e.getCause(), instanceOf( SQLException.class ) );
|
||||
assertThat( e, instanceOf( SQLException.class ) );
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -197,8 +197,8 @@ public void onConstraintViolationOnSaveAndSaveOrUpdate(RuntimeException e) {
|
||||
@Override
|
||||
public void onConstraintViolationOnPersistAndMergeAndFlush(RuntimeException e) {
|
||||
assertThat( e, instanceOf( PersistenceException.class ) );
|
||||
assertThat( e.getCause(), instanceOf( ConstraintViolationException.class ) );
|
||||
assertThat( e.getCause().getCause(), instanceOf( SQLException.class ) );
|
||||
assertThat( e, instanceOf( ConstraintViolationException.class ) );
|
||||
assertThat( e.getCause(), instanceOf( SQLException.class ) );
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -242,7 +242,7 @@ public void onStaleObjectMergeAndUpdateFlush(RuntimeException e) {
|
||||
@Override
|
||||
public void onIdentifierGeneratorFailure(RuntimeException e) {
|
||||
assertThat( e, instanceOf( PersistenceException.class ) );
|
||||
assertThat( e.getCause(), instanceOf( IdentifierGenerationException.class ) );
|
||||
assertThat( e, instanceOf( IdentifierGenerationException.class ) );
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -253,20 +253,20 @@ public void onTransactionExceptionOnSaveAndSaveOrUpdate(RuntimeException e) {
|
||||
@Override
|
||||
public void onTransactionExceptionOnPersistAndMergeAndFlush(RuntimeException e) {
|
||||
assertThat( e, instanceOf( PersistenceException.class ) );
|
||||
assertThat( e.getCause(), instanceOf( TransactionException.class ) );
|
||||
assertThat( e, instanceOf( TransactionException.class ) );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTransactionExceptionOnCommit(RuntimeException e) {
|
||||
assertThat( e, instanceOf( PersistenceException.class ) );
|
||||
assertThat( e.getCause(), instanceOf( TransactionException.class ) );
|
||||
assertThat( e, instanceOf( TransactionException.class ) );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onExecuteUpdateWithConstraintViolation(RuntimeException e) {
|
||||
assertThat( e, instanceOf( PersistenceException.class ) );
|
||||
assertThat( e.getCause(), instanceOf( ConstraintViolationException.class ) );
|
||||
assertThat( e.getCause().getCause(), instanceOf( SQLException.class ) );
|
||||
assertThat( e, instanceOf( ConstraintViolationException.class ) );
|
||||
assertThat( e.getCause(), instanceOf( SQLException.class ) );
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -48,8 +48,8 @@ public void testJdbcExceptionThrown() {
|
||||
fail( "A PersistenceException should have been thrown." );
|
||||
}
|
||||
catch ( PersistenceException ex ) {
|
||||
assertTrue( JDBCException.class.isInstance( ex.getCause() ) );
|
||||
assertTrue( SQLException.class.isInstance( ex.getCause().getCause() ) );
|
||||
assertTrue( JDBCException.class.isInstance( ex ) );
|
||||
assertTrue( SQLException.class.isInstance( ex.getCause() ) );
|
||||
}
|
||||
finally {
|
||||
entityManager.close();
|
||||
|
@ -165,11 +165,11 @@ public void testTimeout() throws Exception {
|
||||
fail( "Transaction should have timed out" );
|
||||
}
|
||||
catch (PersistenceException e) {
|
||||
assertTyping( TransactionException.class, e.getCause() );
|
||||
assertTyping( TransactionException.class, e );
|
||||
assertTrue(
|
||||
"Transaction failed for the wrong reason. Expecting transaction timeout, but found [" +
|
||||
e.getCause().getMessage() + "]",
|
||||
e.getCause().getMessage().contains( "transaction timeout expired" )
|
||||
e.getMessage() + "]",
|
||||
e.getMessage().contains( "transaction timeout expired" )
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -20,7 +20,6 @@
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
import org.junit.Test;
|
||||
|
||||
import jakarta.persistence.PersistenceException;
|
||||
import org.mockito.Mockito;
|
||||
|
||||
import static org.hibernate.testing.transaction.TransactionUtil.doInJPA;
|
||||
@ -89,9 +88,8 @@ public void testNamedQueryWithMarkForRollbackOnlyFailure() {
|
||||
entityManager.createNamedQuery( "NamedQuery" );
|
||||
}
|
||||
catch (Exception e) {
|
||||
assertEquals( PersistenceException.class, e.getClass() );
|
||||
assertEquals( HibernateException.class, e.getCause().getClass() );
|
||||
assertEquals( MarkedForRollbackException.class, e.getCause().getCause().getClass() );
|
||||
assertEquals( HibernateException.class, e.getClass() );
|
||||
assertEquals( MarkedForRollbackException.class, e.getCause().getClass() );
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -84,7 +84,7 @@ public void init() {
|
||||
catch ( Exception expected ) {
|
||||
assertEquals(
|
||||
SQLGrammarException.class,
|
||||
expected.getCause().getClass()
|
||||
expected.getClass()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -139,8 +139,7 @@ public void testConstraintViolationException(EntityManagerFactoryScope scope) {
|
||||
fail();
|
||||
}
|
||||
catch ( PersistenceException e ) {
|
||||
Throwable t = e.getCause();
|
||||
assertTrue( t instanceof ConstraintViolationException, "Should be a constraint violation" );
|
||||
assertTrue( e instanceof ConstraintViolationException, "Should be a constraint violation" );
|
||||
entityManager.getTransaction().rollback();
|
||||
}
|
||||
}
|
||||
|
@ -300,7 +300,7 @@ public void testMultiThreadTransactionTimeout(EntityManagerFactoryScope scope) t
|
||||
em.persist( new Book( "The Book of Foo", 1 ) );
|
||||
}
|
||||
catch (PersistenceException e) {
|
||||
caught = e.getCause().getClass().equals( HibernateException.class );
|
||||
caught = e.getClass().equals( HibernateException.class );
|
||||
}
|
||||
assertTrue( caught );
|
||||
|
||||
|
@ -55,7 +55,7 @@ public void testRemoveAndAddEqualElement(SessionFactoryScope scope) {
|
||||
catch (Exception e) {
|
||||
session.getTransaction().rollback();
|
||||
// expected
|
||||
assertTyping( ConstraintViolationException.class, e.getCause() );
|
||||
assertTyping( ConstraintViolationException.class, e );
|
||||
}
|
||||
}
|
||||
);
|
||||
@ -84,7 +84,7 @@ public void testRemoveAndAddEqualCollection(SessionFactoryScope scope) {
|
||||
catch (PersistenceException e) {
|
||||
session.getTransaction().rollback();
|
||||
// expected
|
||||
assertTyping( ConstraintViolationException.class, e.getCause() );
|
||||
assertTyping( ConstraintViolationException.class, e );
|
||||
}
|
||||
}
|
||||
);
|
||||
@ -113,7 +113,7 @@ public void testRemoveAndAddEqualElementNonKeyModified(SessionFactoryScope scope
|
||||
catch (PersistenceException e) {
|
||||
session.getTransaction().rollback();
|
||||
// expected
|
||||
assertTyping( ConstraintViolationException.class, e.getCause() );
|
||||
assertTyping( ConstraintViolationException.class, e );
|
||||
}
|
||||
}
|
||||
);
|
||||
|
@ -47,7 +47,7 @@ public void storeNonUniqueRelationship(SessionFactoryScope scope) {
|
||||
fail();
|
||||
}
|
||||
catch (PersistenceException e) {
|
||||
assertTyping( ConstraintViolationException.class, e.getCause() );
|
||||
assertTyping( ConstraintViolationException.class, e );
|
||||
// expected
|
||||
}
|
||||
finally {
|
||||
|
@ -137,7 +137,7 @@ public void testCreateException(SessionFactoryScope scope) {
|
||||
catch (PersistenceException e) {
|
||||
|
||||
//verify that an exception is thrown!
|
||||
assertTyping( ConstraintViolationException.class, e.getCause() );
|
||||
assertTyping( ConstraintViolationException.class, e );
|
||||
}
|
||||
finally {
|
||||
if(session.getTransaction().isActive()){
|
||||
@ -160,7 +160,7 @@ public void testCreateException(SessionFactoryScope scope) {
|
||||
}
|
||||
catch (PersistenceException e) {
|
||||
//verify that an exception is thrown!
|
||||
assertTyping( ConstraintViolationException.class, e.getCause() );
|
||||
assertTyping( ConstraintViolationException.class, e );
|
||||
}
|
||||
finally {
|
||||
if(session.getTransaction().isActive()){
|
||||
@ -189,7 +189,7 @@ public void testCreateExceptionWithGeneratedId(SessionFactoryScope scope) {
|
||||
}
|
||||
catch (PersistenceException e) {
|
||||
//verify that an exception is thrown!
|
||||
assertTyping( PersistentObjectException.class, e.getCause() );
|
||||
assertTyping( PersistentObjectException.class, e );
|
||||
}
|
||||
}
|
||||
);
|
||||
@ -205,7 +205,7 @@ public void testCreateExceptionWithGeneratedId(SessionFactoryScope scope) {
|
||||
}
|
||||
catch (PersistenceException e) {
|
||||
//verify that an exception is thrown!
|
||||
assertTyping( PersistentObjectException.class, e.getCause() );
|
||||
assertTyping( PersistentObjectException.class, e );
|
||||
}
|
||||
}
|
||||
);
|
||||
|
@ -99,7 +99,7 @@ public void testErrorOnInsert(SessionFactoryScope scope) {
|
||||
fail("should have thrown");
|
||||
}
|
||||
catch (Throwable e) {
|
||||
assertTrue( e.getCause() instanceof PropertyValueException );
|
||||
assertTrue( e instanceof PropertyValueException );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -101,7 +101,7 @@ public void testErrorOnInsert(SessionFactoryScope scope) {
|
||||
fail("should have thrown");
|
||||
}
|
||||
catch (Throwable e) {
|
||||
assertTrue( e.getCause() instanceof PropertyValueException );
|
||||
assertTrue( e instanceof PropertyValueException );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -103,7 +103,7 @@ public void testErrorOnInsert(SessionFactoryScope scope) {
|
||||
fail("should have thrown");
|
||||
}
|
||||
catch (Throwable e) {
|
||||
assertTrue( e.getCause() instanceof PropertyValueException );
|
||||
assertTrue( e instanceof PropertyValueException );
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user