/*
* 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.events;
import org.hibernate.IrrelevantEntity;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.registry.BootstrapServiceRegistryBuilder;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.event.service.spi.EventListenerRegistry;
import org.hibernate.event.spi.EventType;
import org.hibernate.event.spi.PostCommitDeleteEventListener;
import org.hibernate.event.spi.PostCommitInsertEventListener;
import org.hibernate.event.spi.PostCommitUpdateEventListener;
import org.hibernate.event.spi.PostDeleteEvent;
import org.hibernate.event.spi.PostDeleteEventListener;
import org.hibernate.event.spi.PostInsertEvent;
import org.hibernate.event.spi.PostInsertEventListener;
import org.hibernate.event.spi.PostUpdateEvent;
import org.hibernate.event.spi.PostUpdateEventListener;
import org.hibernate.integrator.spi.Integrator;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.service.spi.SessionFactoryServiceRegistry;
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
import org.junit.Assert;
import org.junit.Test;
/**
* Test to ensure that the existing post commit behavior when using plain PostXEventListeners fire on both success and failure.
*
* @author ShawnClowater
*/
public class PostCommitListenerTest extends BaseCoreFunctionalTestCase {
private PostInsertEventListener postCommitInsertEventListener = new TestPostCommitInsertEventListener();
private PostDeleteEventListener postCommitDeleteEventListener = new TestPostCommitDeleteEventListener();
private PostUpdateEventListener postCommitUpdateEventListener = new TestPostCommitUpdateEventListener();
@Override
protected void prepareTest() throws Exception {
((TestPostCommitInsertEventListener) postCommitInsertEventListener).success = 0;
((TestPostCommitInsertEventListener) postCommitInsertEventListener).failed = 0;
((TestPostCommitDeleteEventListener) postCommitDeleteEventListener).success = 0;
((TestPostCommitDeleteEventListener) postCommitDeleteEventListener).failed = 0;
((TestPostCommitUpdateEventListener) postCommitUpdateEventListener).sucess = 0;
((TestPostCommitUpdateEventListener) postCommitUpdateEventListener).failed = 0;
}
@Override
protected void prepareBootstrapRegistryBuilder(BootstrapServiceRegistryBuilder builder) {
super.prepareBootstrapRegistryBuilder( builder );
builder.applyIntegrator(
new Integrator() {
@Override
public void integrate(
Metadata metadata,
SessionFactoryImplementor sessionFactory,
SessionFactoryServiceRegistry serviceRegistry) {
integrate( serviceRegistry );
}
private void integrate(SessionFactoryServiceRegistry serviceRegistry) {
serviceRegistry.getService( EventListenerRegistry.class ).getEventListenerGroup(
EventType.POST_COMMIT_DELETE
).appendListener( postCommitDeleteEventListener );
serviceRegistry.getService( EventListenerRegistry.class ).getEventListenerGroup(
EventType.POST_COMMIT_UPDATE
).appendListener( postCommitUpdateEventListener );
serviceRegistry.getService( EventListenerRegistry.class ).getEventListenerGroup(
EventType.POST_COMMIT_INSERT
).appendListener( postCommitInsertEventListener );
}
@Override
public void disintegrate(
SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) {
}
}
);
}
@Test
@TestForIssue(jiraKey = "HHH-1582")
public void testPostCommitInsertListenerSuccess() {
Session session = openSession();
Transaction transaction = session.beginTransaction();
IrrelevantEntity irrelevantEntity = new IrrelevantEntity();
irrelevantEntity.setName( "Irrelevant" );
session.save( irrelevantEntity );
session.flush();
transaction.commit();
session.close();
Assert.assertEquals( 1, ((TestPostCommitInsertEventListener) postCommitInsertEventListener).success );
Assert.assertEquals( 0, ((TestPostCommitInsertEventListener) postCommitInsertEventListener).failed );
}
@Test
@TestForIssue(jiraKey = "HHH-1582")
public void testPostCommitInsertListenerRollback() {
Session session = openSession();
Transaction transaction = session.beginTransaction();
IrrelevantEntity irrelevantEntity = new IrrelevantEntity();
irrelevantEntity.setName( "Irrelevant" );
session.save( irrelevantEntity );
session.flush();
transaction.rollback();
session.close();
Assert.assertEquals( 0, ((TestPostCommitInsertEventListener) postCommitInsertEventListener).success );
Assert.assertEquals( 1, ((TestPostCommitInsertEventListener) postCommitInsertEventListener).failed );
}
@Test
@TestForIssue(jiraKey = "HHH-1582")
public void testPostCommitUpdateListenerSuccess() {
Session session = openSession();
Transaction transaction = session.beginTransaction();
IrrelevantEntity irrelevantEntity = new IrrelevantEntity();
irrelevantEntity.setName( "Irrelevant" );
session.save( irrelevantEntity );
session.flush();
transaction.commit();
session = openSession();
transaction = session.beginTransaction();
irrelevantEntity.setName( "Irrelevant 2" );
session.update( irrelevantEntity );
session.flush();
transaction.commit();
session.close();
Assert.assertEquals( 1, ((TestPostCommitUpdateEventListener) postCommitUpdateEventListener).sucess );
Assert.assertEquals( 0, ((TestPostCommitUpdateEventListener) postCommitUpdateEventListener).failed );
}
@Test
@TestForIssue(jiraKey = "HHH-1582")
public void testPostCommitUpdateListenerRollback() {
Session session = openSession();
Transaction transaction = session.beginTransaction();
IrrelevantEntity irrelevantEntity = new IrrelevantEntity();
irrelevantEntity.setName( "Irrelevant" );
session.save( irrelevantEntity );
session.flush();
transaction.commit();
session.close();
session = openSession();
transaction = session.beginTransaction();
irrelevantEntity.setName( "Irrelevant 2" );
session.update( irrelevantEntity );
session.flush();
transaction.rollback();
session.close();
Assert.assertEquals( 0, ((TestPostCommitUpdateEventListener) postCommitUpdateEventListener).sucess );
Assert.assertEquals( 1, ((TestPostCommitUpdateEventListener) postCommitUpdateEventListener).failed );
}
@Test
@TestForIssue(jiraKey = "HHH-1582")
public void testPostCommitDeleteListenerSuccess() {
Session session = openSession();
Transaction transaction = session.beginTransaction();
IrrelevantEntity irrelevantEntity = new IrrelevantEntity();
irrelevantEntity.setName( "Irrelevant" );
session.save( irrelevantEntity );
session.flush();
transaction.commit();
session.close();
session = openSession();
transaction = session.beginTransaction();
session.delete( irrelevantEntity );
session.flush();
transaction.commit();
session.close();
Assert.assertEquals( 1, ((TestPostCommitDeleteEventListener) postCommitDeleteEventListener).success );
Assert.assertEquals( 0, ((TestPostCommitDeleteEventListener) postCommitDeleteEventListener).failed );
}
@Test
@TestForIssue(jiraKey = "HHH-1582")
public void testPostCommitDeleteListenerRollback() {
Session session = openSession();
Transaction transaction = session.beginTransaction();
IrrelevantEntity irrelevantEntity = new IrrelevantEntity();
irrelevantEntity.setName( "Irrelevant" );
session.save( irrelevantEntity );
session.flush();
transaction.commit();
session.close();
session = openSession();
transaction = session.beginTransaction();
session.delete( irrelevantEntity );
session.flush();
transaction.rollback();
session.close();
Assert.assertEquals( 0, ((TestPostCommitDeleteEventListener) postCommitDeleteEventListener).success );
Assert.assertEquals( 1, ((TestPostCommitDeleteEventListener) postCommitDeleteEventListener).failed );
}
private class TestPostCommitDeleteEventListener implements PostCommitDeleteEventListener {
int success;
int failed;
@Override
public void onPostDelete(PostDeleteEvent event) {
success++;
}
@Override
public void onPostDeleteCommitFailed(PostDeleteEvent event) {
failed++;
}
@Override
public boolean requiresPostCommitHanding(EntityPersister persister) {
return true;
}
}
private class TestPostCommitUpdateEventListener implements PostCommitUpdateEventListener {
int sucess;
int failed;
@Override
public void onPostUpdate(PostUpdateEvent event) {
sucess++;
}
@Override
public void onPostUpdateCommitFailed(PostUpdateEvent event) {
failed++;
}
@Override
public boolean requiresPostCommitHanding(EntityPersister persister) {
return true;
}
}
private class TestPostCommitInsertEventListener implements PostCommitInsertEventListener {
int success;
int failed;
@Override
public void onPostInsert(PostInsertEvent event) {
success++;
}
@Override
public void onPostInsertCommitFailed(PostInsertEvent event) {
failed++;
}
@Override
public boolean requiresPostCommitHanding(EntityPersister persister) {
return true;
}
}
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class[] {IrrelevantEntity.class};
}
}