Skip to content

Commit

Permalink
HHH-13214 Delete re-firing SQL from previous calls
Browse files Browse the repository at this point in the history
  • Loading branch information
dreab8 authored and Sanne committed Jul 15, 2020
1 parent 0b71131 commit 3553576
Show file tree
Hide file tree
Showing 3 changed files with 120 additions and 4 deletions.
Expand Up @@ -18,6 +18,7 @@
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.hql.internal.ast.HqlSqlWalker;
import org.hibernate.hql.spi.id.MultiTableBulkIdStrategy;
import org.hibernate.internal.util.collections.ArrayHelper;
import org.hibernate.persister.collection.AbstractCollectionPersister;
import org.hibernate.persister.entity.Queryable;
import org.hibernate.sql.Delete;
Expand All @@ -33,7 +34,7 @@ public abstract class AbstractInlineIdsDeleteHandlerImpl
extends AbstractInlineIdsBulkIdHandler
implements MultiTableBulkIdStrategy.DeleteHandler {

private List<String> deletes;
private List<String> deletes = new ArrayList<>();

public AbstractInlineIdsDeleteHandlerImpl(
SessionFactoryImplementor factory,
Expand All @@ -44,7 +45,7 @@ public AbstractInlineIdsDeleteHandlerImpl(
@Override
public String[] getSqlStatements() {
if ( deletes.isEmpty() ) {
return new String[0];
return ArrayHelper.EMPTY_STRING_ARRAY;
}
return deletes.toArray( new String[deletes.size()] );
}
Expand All @@ -55,7 +56,6 @@ public int execute(
QueryParameters queryParameters) {

IdsClauseBuilder values = prepareInlineStatement( session, queryParameters );
deletes = new ArrayList<>();

if ( !values.getIds().isEmpty() ) {
final String idSubselect = values.toStatement();
Expand Down
Expand Up @@ -22,6 +22,7 @@
import org.hibernate.hql.internal.ast.HqlSqlWalker;
import org.hibernate.hql.internal.ast.tree.AssignmentSpecification;
import org.hibernate.hql.spi.id.MultiTableBulkIdStrategy;
import org.hibernate.internal.util.collections.ArrayHelper;
import org.hibernate.param.ParameterSpecification;
import org.hibernate.persister.entity.Queryable;
import org.hibernate.sql.Update;
Expand All @@ -48,7 +49,7 @@ public AbstractInlineIdsUpdateHandlerImpl(
@Override
public String[] getSqlStatements() {
if ( updates == null ) {
return new String[0];
return ArrayHelper.EMPTY_STRING_ARRAY;
}
return updates.values().toArray( new String[updates.values().size()] );
}
Expand Down
@@ -0,0 +1,115 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.test.inheritance;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Query;
import javax.persistence.Table;

import org.hibernate.cfg.AvailableSettings;
import org.hibernate.cfg.Configuration;
import org.hibernate.hql.spi.id.inline.InlineIdsInClauseBulkIdStrategy;
import org.hibernate.stat.spi.StatisticsImplementor;

import org.hibernate.testing.DialectChecks;
import org.hibernate.testing.RequiresDialectFeature;
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
import org.junit.Before;
import org.junit.Test;

import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hibernate.testing.transaction.TransactionUtil.doInHibernate;

/**
* @author Andrea Boriero
*/
@RequiresDialectFeature(DialectChecks.SupportsRowValueConstructorSyntaxInInListCheck.class)
@TestForIssue(jiraKey = "HHH-13214")
public class InheritanceDeleteBatchTest extends BaseCoreFunctionalTestCase {

@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class[] {
TestEntity.class,
TestEntityType1.class,
TestEntityType2.class
};
}

@Override
protected void configure(Configuration configuration) {
configuration.setProperty(
AvailableSettings.HQL_BULK_ID_STRATEGY,
InlineIdsInClauseBulkIdStrategy.class.getName()
);
configuration.setProperty( AvailableSettings.GENERATE_STATISTICS, "true" );
}

@Before
public void setUp() {
doInHibernate( this::sessionFactory, session -> {
session.persist( new TestEntity( 1 ) );
session.persist( new TestEntityType1( 2 ) );
session.persist( new TestEntityType2( 3 ) );
session.persist( new TestEntityType2( 4 ) );
} );
}

@Test
public void testDelete() {
StatisticsImplementor statistics = sessionFactory().getStatistics();
statistics.clear();
doInHibernate( this::sessionFactory, session -> {
for ( int i = 1; i <= 4; i++ ) {
Query deleteQuery = session.createQuery( "delete TestEntity e where e.id = :id" );
deleteQuery.setParameter( "id", i );
deleteQuery.executeUpdate();
assertThat( statistics.getPrepareStatementCount(), is( 4L ) );
statistics.clear();
}
} );
}

@Entity(name = "TestEntity")
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "test_entity")
public static class TestEntity {
@Id
int id;

private String field;

public TestEntity() {
}

public TestEntity(int id) {
this.id = id;
}
}

@Entity(name = "TestEntityType1")
@Table(name = "test_entity_type1")
public static class TestEntityType1 extends TestEntity {

public TestEntityType1(int id) {
super( id );
}
}

@Entity(name = "TestEntityType2")
@Table(name = "test_entity_type2")
public static class TestEntityType2 extends TestEntity {
public TestEntityType2(int id) {
super( id );
}
}
}

0 comments on commit 3553576

Please sign in to comment.