diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/batch/internal/AbstractBatchImpl.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/batch/internal/AbstractBatchImpl.java index 03dfb5d98811..a960e256f60f 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/batch/internal/AbstractBatchImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/batch/internal/AbstractBatchImpl.java @@ -133,7 +133,11 @@ public PreparedStatement getBatchStatement(String sql, boolean callable) { } private PreparedStatement buildBatchStatement(String sql, boolean callable) { - return jdbcCoordinator.getStatementPreparer().prepareStatement( sql, callable ); + if (statements.isEmpty()) { + return jdbcCoordinator.getStatementPreparer().prepareStatement(sql, callable); + } + + return jdbcCoordinator.getStatementPreparer().prepareSecondaryBatchStatement(sql, callable); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/internal/StatementPreparerImpl.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/internal/StatementPreparerImpl.java index a6b44fc50b7f..87dcbfdbea36 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/internal/StatementPreparerImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/internal/StatementPreparerImpl.java @@ -78,6 +78,12 @@ public PreparedStatement prepareStatement(String sql, final boolean isCallable) return buildPreparedStatementPreparationTemplate( sql, isCallable ).prepareStatement(); } + @Override + public PreparedStatement prepareSecondaryBatchStatement(String sql, final boolean isCallable) { + //do not execute batch here + return buildPreparedStatementPreparationTemplate( sql, isCallable ).prepareStatement(); + } + private StatementPreparationTemplate buildPreparedStatementPreparationTemplate(String sql, final boolean isCallable) { return new StatementPreparationTemplate( sql ) { @Override diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/spi/StatementPreparer.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/spi/StatementPreparer.java index 7b2a555ca362..1d91ad7b9a42 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/spi/StatementPreparer.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/spi/StatementPreparer.java @@ -85,4 +85,14 @@ public interface StatementPreparer { * @return the prepared statement */ public PreparedStatement prepareQueryStatement(String sql, boolean isCallable, ScrollMode scrollMode); + + /** + * Prepare a second statement for an active batch (e.g. when performing inserts on entities using joined table inheritance). + * + * @param sql The SQL the statement to be prepared + * @param isCallable Whether to prepare as a callable statement. + * + * @return the prepared statement + */ + public PreparedStatement prepareSecondaryBatchStatement(String sql, boolean isCallable); } diff --git a/hibernate-core/src/test/java/org/hibernate/test/insertordering/InsertOrderingWithJoinedTableInheritance.java b/hibernate-core/src/test/java/org/hibernate/test/insertordering/InsertOrderingWithJoinedTableInheritance.java index 7a4092ccc340..c1907fbb6bb7 100644 --- a/hibernate-core/src/test/java/org/hibernate/test/insertordering/InsertOrderingWithJoinedTableInheritance.java +++ b/hibernate-core/src/test/java/org/hibernate/test/insertordering/InsertOrderingWithJoinedTableInheritance.java @@ -101,7 +101,7 @@ public void testBatchingAmongstSubClasses() { connectionProvider.clear(); } ); - assertEquals( 26, connectionProvider.getPreparedStatements().size() ); + assertEquals( 4, connectionProvider.getPreparedStatements().size() ); } @Override diff --git a/hibernate-core/src/test/java/org/hibernate/test/insertordering/InsertOrderingWithJoinedTableMultiLevelInheritance.java b/hibernate-core/src/test/java/org/hibernate/test/insertordering/InsertOrderingWithJoinedTableMultiLevelInheritance.java index ab4fb1b94c60..27322d7eddd9 100644 --- a/hibernate-core/src/test/java/org/hibernate/test/insertordering/InsertOrderingWithJoinedTableMultiLevelInheritance.java +++ b/hibernate-core/src/test/java/org/hibernate/test/insertordering/InsertOrderingWithJoinedTableMultiLevelInheritance.java @@ -102,7 +102,7 @@ public void testBatchingAmongstSubClasses() { connectionProvider.clear(); } ); - assertEquals( 17, connectionProvider.getPreparedStatements().size() ); + assertEquals( 10, connectionProvider.getPreparedStatements().size() ); } @Override