/*
* 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.batch;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OptimisticLockException;
import javax.persistence.Version;
import org.hibernate.cfg.AvailableSettings;
import org.hibernate.testing.junit4.BaseNonConfigCoreFunctionalTestCase;
import org.junit.Test;
import static org.hibernate.testing.transaction.TransactionUtil.doInHibernate;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
/**
* @author Vlad Mihalcea
*/
public class BatchOptimisticLockingTest extends
BaseNonConfigCoreFunctionalTestCase {
private final ExecutorService executorService = Executors.newSingleThreadExecutor();
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class<?>[]{
Person.class,
};
}
@Override
protected void addSettings(Map settings) {
settings.put( AvailableSettings.STATEMENT_BATCH_SIZE, String.valueOf( 2 ) );
}
@Test
public void testBatchAndOptimisticLocking() {
doInHibernate( this::sessionFactory, session -> {
Person person1 = new Person();
person1.id = 1L;
person1.name = "First";
session.persist( person1 );
Person person2 = new Person();
person2.id = 2L;
person2.name = "Second";
session.persist( person2 );
Person person3 = new Person();
person3.id = 3L;
person3.name = "Third";
session.persist( person3 );
} );
try {
doInHibernate( this::sessionFactory, session -> {
List<Person> persons = session.createQuery( "select p from Person p").getResultList();
for ( int i = 0; i < persons.size(); i++ ) {
Person person = persons.get( i );
person.name += " Person";
if ( i == 1 ) {
try {
executorService.submit( () -> {
doInHibernate( this::sessionFactory, _session -> {
Person _person = _session.find( Person.class, person.id );
_person.name += " Person is the new Boss!";
} );
} ).get();
}
catch (InterruptedException|ExecutionException e) {
fail(e.getMessage());
}
}
}
} );
}
catch (Exception expected) {
assertEquals( OptimisticLockException.class, expected.getClass());
}
}
@Entity(name = "Person")
public static class Person {
@Id
private Long id;
private String name;
@Version
private long version;
}
}