/* * 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.jpa.event.internal.core; import org.hibernate.engine.spi.EntityEntry; import org.hibernate.engine.spi.Status; import org.hibernate.event.spi.EventSource; import org.hibernate.event.spi.PostCollectionRecreateEvent; import org.hibernate.event.spi.PostCollectionRecreateEventListener; import org.hibernate.event.spi.PostCollectionRemoveEvent; import org.hibernate.event.spi.PostCollectionRemoveEventListener; import org.hibernate.event.spi.PostCollectionUpdateEvent; import org.hibernate.event.spi.PostCollectionUpdateEventListener; import org.hibernate.event.spi.PostUpdateEvent; import org.hibernate.event.spi.PostUpdateEventListener; import org.hibernate.jpa.event.spi.jpa.CallbackRegistryConsumer; import org.hibernate.jpa.event.spi.jpa.CallbackRegistry; import org.hibernate.jpa.event.spi.jpa.CallbackType; import org.hibernate.persister.entity.EntityPersister; /** * Implementation of the post update listeners. * * @author <a href="mailto:kabir.khan@jboss.org">Kabir Khan</a> */ @SuppressWarnings("serial") public class JpaPostUpdateEventListener implements PostUpdateEventListener, CallbackRegistryConsumer, PostCollectionRecreateEventListener, PostCollectionRemoveEventListener, PostCollectionUpdateEventListener { private CallbackRegistry callbackRegistry; @Override public void injectCallbackRegistry(CallbackRegistry callbackRegistry) { this.callbackRegistry = callbackRegistry; } public JpaPostUpdateEventListener() { super(); } public JpaPostUpdateEventListener(CallbackRegistry callbackRegistry) { this.callbackRegistry = callbackRegistry; } @Override public void onPostUpdate(PostUpdateEvent event) { Object entity = event.getEntity(); EventSource eventSource = event.getSession(); handlePostUpdate(entity, eventSource); } private void handlePostUpdate(Object entity, EventSource source) { EntityEntry entry = (EntityEntry) source.getPersistenceContext().getEntry( entity ); // mimic the preUpdate filter if ( Status.DELETED != entry.getStatus()) { callbackRegistry.postUpdate(entity); } } @Override public boolean requiresPostCommitHanding(EntityPersister persister) { return callbackRegistry.hasRegisteredCallbacks( persister.getMappedClass(), CallbackType.POST_UPDATE ); } @Override public void onPostRecreateCollection(PostCollectionRecreateEvent event) { Object entity = event.getCollection().getOwner(); EventSource eventSource = event.getSession(); handlePostUpdate(entity, eventSource); } @Override public void onPostRemoveCollection(PostCollectionRemoveEvent event) { Object entity = event.getCollection().getOwner(); EventSource eventSource = event.getSession(); handlePostUpdate(entity, eventSource); } @Override public void onPostUpdateCollection(PostCollectionUpdateEvent event) { Object entity = event.getCollection().getOwner(); EventSource eventSource = event.getSession(); handlePostUpdate(entity, eventSource); } }