package org.hibernate.test.bulkid;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import org.hibernate.cfg.AvailableSettings;
import org.hibernate.cfg.Configuration;
import org.hibernate.hql.spi.id.MultiTableBulkIdStrategy;
import org.hibernate.testing.DialectChecks;
import org.hibernate.testing.RequiresDialectFeature;
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
import org.junit.Before;
import org.junit.Test;
import static org.hibernate.testing.transaction.TransactionUtil.doInHibernate;
import static org.junit.Assert.assertEquals;
/**
* @author Vlad Mihalcea
*/
public abstract class AbstractBulkIdTest extends BaseCoreFunctionalTestCase {
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class<?>[] {
Person.class,
Doctor.class,
Engineer.class
};
}
@Override
protected Configuration constructConfiguration() {
Configuration configuration = super.constructConfiguration();
configuration.setProperty( AvailableSettings.HQL_BULK_ID_STRATEGY, getMultiTableBulkIdStrategyClass().getName() );
return configuration;
}
protected abstract Class<? extends MultiTableBulkIdStrategy> getMultiTableBulkIdStrategyClass();
@Override
protected boolean isCleanupTestDataRequired() {
return true;
}
@Override
protected boolean isCleanupTestDataUsingBulkDelete() {
return true;
}
@Before
public void setUp() {
doInHibernate( this::sessionFactory, session -> {
for ( int i = 0; i < entityCount(); i++ ) {
Doctor doctor = new Doctor();
doctor.setEmployed( ( i % 2 ) == 0 );
session.persist( doctor );
}
for ( int i = 0; i < entityCount(); i++ ) {
Engineer engineer = new Engineer();
engineer.setEmployed( ( i % 2 ) == 0 );
engineer.setFellow( ( i % 2 ) == 1 );
session.persist( engineer );
}
});
}
protected int entityCount() {
return 10;
}
@Test
public void testUpdate() {
doInHibernate( this::sessionFactory, session -> {
int updateCount = session.createQuery( "update Person set name = :name where employed = :employed" )
.setParameter( "name", "John Doe" )
.setParameter( "employed", true )
.executeUpdate();
assertEquals(entityCount(), updateCount);
});
}
@Test
public void testDeleteFromPerson() {
doInHibernate( this::sessionFactory, session -> {
//tag::batch-bulk-hql-temp-table-delete-query-example[]
int updateCount = session.createQuery(
"delete from Person where employed = :employed" )
.setParameter( "employed", false )
.executeUpdate();
//end::batch-bulk-hql-temp-table-delete-query-example[]
assertEquals( entityCount(), updateCount );
});
}
@Test
public void testDeleteFromEngineer() {
doInHibernate( this::sessionFactory, session -> {
int updateCount = session.createQuery( "delete from Engineer where fellow = :fellow" )
.setParameter( "fellow", true )
.executeUpdate();
assertEquals( entityCount() / 2, updateCount );
});
}
//tag::batch-bulk-hql-temp-table-base-class-example[]
@Entity(name = "Person")
@Inheritance(strategy = InheritanceType.JOINED)
public static class Person {
@Id
@GeneratedValue
private Long id;
private String name;
private boolean employed;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isEmployed() {
return employed;
}
public void setEmployed(boolean employed) {
this.employed = employed;
}
}
//end::batch-bulk-hql-temp-table-base-class-example[]
//tag::batch-bulk-hql-temp-table-sub-classes-example[]
@Entity(name = "Doctor")
public static class Doctor extends Person {
}
@Entity(name = "Engineer")
public static class Engineer extends Person {
private boolean fellow;
public boolean isFellow() {
return fellow;
}
public void setFellow(boolean fellow) {
this.fellow = fellow;
}
}
//end::batch-bulk-hql-temp-table-sub-classes-example[]
}