/*
* 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.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 LegacyPostCommitListenerTest extends BaseCoreFunctionalTestCase {
private PostInsertEventListener postCommitInsertEventListener = new LegacyPostCommitInsertEventListener();
private PostDeleteEventListener postCommitDeleteEventListener = new LegacyPostCommitDeleteEventListener();
private PostUpdateEventListener postCommitUpdateEventListener = new LegacyPostCommitUpdateEventListener();
@Override
protected void prepareTest() throws Exception {
((LegacyPostCommitInsertEventListener) postCommitInsertEventListener).fired = 0;
((LegacyPostCommitDeleteEventListener) postCommitDeleteEventListener).fired = 0;
((LegacyPostCommitUpdateEventListener) postCommitUpdateEventListener).fired = 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, ((LegacyPostCommitInsertEventListener) postCommitInsertEventListener).fired );
}
@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();
//the legacy implementation fires the listener on failure as well
Assert.assertEquals( 1, ((LegacyPostCommitInsertEventListener) postCommitInsertEventListener).fired );
}
@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, ((LegacyPostCommitUpdateEventListener) postCommitUpdateEventListener).fired );
}
@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();
//the legacy implementation fires the listener on failure as well
Assert.assertEquals( 1, ((LegacyPostCommitUpdateEventListener) postCommitUpdateEventListener).fired );
}
@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, ((LegacyPostCommitDeleteEventListener) postCommitDeleteEventListener).fired );
}
@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();
//the legacy implementation fires the listener on failure as well
Assert.assertEquals( 1, ((LegacyPostCommitDeleteEventListener) postCommitDeleteEventListener).fired );
}
private class LegacyPostCommitDeleteEventListener implements PostDeleteEventListener {
int fired;
@Override
public void onPostDelete(PostDeleteEvent event) {
fired++;
}
@Override
public boolean requiresPostCommitHanding(EntityPersister persister) {
return true;
}
}
private class LegacyPostCommitUpdateEventListener implements PostUpdateEventListener {
int fired;
@Override
public void onPostUpdate(PostUpdateEvent event) {
fired++;
}
@Override
public boolean requiresPostCommitHanding(EntityPersister persister) {
return true;
}
}
private class LegacyPostCommitInsertEventListener implements PostInsertEventListener {
int fired;
@Override
public void onPostInsert(PostInsertEvent event) {
fired++;
}
@Override
public boolean requiresPostCommitHanding(EntityPersister persister) {
return true;
}
}
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class[] {IrrelevantEntity.class};
}
}