HHH-7387 - Integrate Draft 6 of the JPA 2.1 spec : CDI (small test change)

This commit is contained in:
Steve Ebersole 2012-08-18 12:30:21 -05:00
parent c9ff6f2fe2
commit 4282e23caa
42 changed files with 345 additions and 115 deletions

View File

@ -37,6 +37,7 @@ import org.hibernate.event.service.spi.EventListenerGroup;
import org.hibernate.event.spi.EventType;
import org.hibernate.event.spi.PostDeleteEvent;
import org.hibernate.event.spi.PostDeleteEventListener;
import org.hibernate.event.spi.PostInsertEventListener;
import org.hibernate.event.spi.PreDeleteEvent;
import org.hibernate.event.spi.PreDeleteEventListener;
import org.hibernate.persister.entity.EntityPersister;
@ -189,6 +190,13 @@ public final class EntityDeleteAction extends EntityAction {
@Override
protected boolean hasPostCommitEventListeners() {
return ! listenerGroup( EventType.POST_COMMIT_DELETE ).isEmpty();
final EventListenerGroup<PostDeleteEventListener> group = listenerGroup( EventType.POST_COMMIT_DELETE );
for ( PostDeleteEventListener listener : group.listeners() ) {
if ( listener.requiresPostCommitHanding( getPersister() ) ) {
return true;
}
}
return false;
}
}

View File

@ -116,7 +116,14 @@ public final class EntityIdentityInsertAction extends AbstractEntityInsertAction
@Override
protected boolean hasPostCommitEventListeners() {
return ! listenerGroup( EventType.POST_COMMIT_INSERT ).isEmpty();
final EventListenerGroup<PostInsertEventListener> group = listenerGroup( EventType.POST_COMMIT_INSERT );
for ( PostInsertEventListener listener : group.listeners() ) {
if ( listener.requiresPostCommitHanding( getPersister() ) ) {
return true;
}
}
return false;
}
@Override

View File

@ -204,7 +204,14 @@ public final class EntityInsertAction extends AbstractEntityInsertAction {
@Override
protected boolean hasPostCommitEventListeners() {
return ! listenerGroup( EventType.POST_COMMIT_INSERT ).isEmpty();
final EventListenerGroup<PostInsertEventListener> group = listenerGroup( EventType.POST_COMMIT_INSERT );
for ( PostInsertEventListener listener : group.listeners() ) {
if ( listener.requiresPostCommitHanding( getPersister() ) ) {
return true;
}
}
return false;
}
private boolean isCachePutEnabled(EntityPersister persister, SessionImplementor session) {

View File

@ -277,7 +277,14 @@ public final class EntityUpdateAction extends EntityAction {
@Override
protected boolean hasPostCommitEventListeners() {
return ! listenerGroup( EventType.POST_COMMIT_UPDATE ).isEmpty();
final EventListenerGroup<PostUpdateEventListener> group = listenerGroup( EventType.POST_COMMIT_UPDATE );
for ( PostUpdateEventListener listener : group.listeners() ) {
if ( listener.requiresPostCommitHanding( getPersister() ) ) {
return true;
}
}
return false;
}
@Override

View File

@ -25,6 +25,8 @@ package org.hibernate.event.spi;
import java.io.Serializable;
import org.hibernate.persister.entity.EntityPersister;
/**
* Called after deleting an item from the datastore
*
@ -32,4 +34,6 @@ import java.io.Serializable;
*/
public interface PostDeleteEventListener extends Serializable {
public void onPostDelete(PostDeleteEvent event);
public boolean requiresPostCommitHanding(EntityPersister persister);
}

View File

@ -25,11 +25,25 @@ package org.hibernate.event.spi;
import java.io.Serializable;
import org.hibernate.persister.entity.EntityPersister;
/**
* Called after insterting an item in the datastore
*
* @author Gavin King
* @author Steve Ebersole
*/
public interface PostInsertEventListener extends Serializable {
public void onPostInsert(PostInsertEvent event);
/**
* Does this listener require that after transaction hooks be registered? Typically this is {@code true}
* for post-insert event listeners, but may not be, for example, in JPA cases where there are no callbacks defined
* for the particular entity.
*
* @param persister The persister for the entity in question.
*
* @return {@code true} if after transaction callbacks should be added.
*/
public boolean requiresPostCommitHanding(EntityPersister persister);
}

View File

@ -25,6 +25,8 @@ package org.hibernate.event.spi;
import java.io.Serializable;
import org.hibernate.persister.entity.EntityPersister;
/**
* Called after updating the datastore
*
@ -32,4 +34,6 @@ import java.io.Serializable;
*/
public interface PostUpdateEventListener extends Serializable {
public void onPostUpdate(PostUpdateEvent event);
public boolean requiresPostCommitHanding(EntityPersister persister);
}

View File

@ -34,6 +34,8 @@ import org.hibernate.IrrelevantEntity;
import org.hibernate.Session;
import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.engine.transaction.spi.TransactionContext;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
@ -241,12 +243,20 @@ public class SessionWithSharedConnectionTest extends BaseCoreFunctionalTestCase
EventListenerRegistry eventListenerRegistry = sessionFactory().getServiceRegistry().getService(EventListenerRegistry.class);
//register a post commit listener
eventListenerRegistry.appendListeners( EventType.POST_COMMIT_INSERT, new PostInsertEventListener(){
eventListenerRegistry.appendListeners(
EventType.POST_COMMIT_INSERT,
new PostInsertEventListener() {
@Override
public void onPostInsert(PostInsertEvent event) {
((IrrelevantEntity) event.getEntity()).setName( postCommitMessage );
}
});
@Override
public boolean requiresPostCommitHanding(EntityPersister persister) {
return true;
}
}
);
session.getTransaction().begin();

View File

@ -84,7 +84,7 @@ import org.hibernate.jpa.boot.spi.IntegratorProvider;
import org.hibernate.jpa.boot.spi.PersistenceUnitDescriptor;
import org.hibernate.jpa.internal.EntityManagerFactoryImpl;
import org.hibernate.jpa.internal.EntityManagerMessageLogger;
import org.hibernate.jpa.internal.event.JpaIntegrator;
import org.hibernate.jpa.event.spi.JpaIntegrator;
import org.hibernate.jpa.internal.util.LogHelper;
import org.hibernate.jpa.internal.util.PersistenceUnitTransactionTypeHelper;
import org.hibernate.jpa.packaging.internal.NativeScanner;

View File

@ -21,7 +21,7 @@
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.hibernate.jpa.internal.event.core;
package org.hibernate.jpa.event.internal.core;
/**
* Marker interface for handling listener duplication checking (to avoid multiple registrations).

View File

@ -21,7 +21,7 @@
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.hibernate.jpa.internal.event.core;
package org.hibernate.jpa.event.internal.core;
import java.util.IdentityHashMap;

View File

@ -21,15 +21,15 @@
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.hibernate.jpa.internal.event.core;
package org.hibernate.jpa.event.internal.core;
import java.io.Serializable;
import org.hibernate.event.internal.DefaultDeleteEventListener;
import org.hibernate.event.spi.DeleteEvent;
import org.hibernate.event.spi.EventSource;
import org.hibernate.jpa.internal.event.jpa.CallbackRegistryConsumer;
import org.hibernate.jpa.internal.event.jpa.CallbackRegistry;
import org.hibernate.jpa.event.internal.jpa.CallbackRegistryConsumer;
import org.hibernate.jpa.event.spi.jpa.CallbackRegistry;
import org.hibernate.persister.entity.EntityPersister;
/**

View File

@ -21,15 +21,15 @@
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.hibernate.jpa.internal.event.core;
package org.hibernate.jpa.event.internal.core;
import org.hibernate.SessionFactory;
import org.hibernate.engine.spi.EntityEntry;
import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.engine.spi.Status;
import org.hibernate.event.internal.DefaultFlushEntityEventListener;
import org.hibernate.jpa.internal.event.jpa.CallbackRegistryConsumer;
import org.hibernate.jpa.internal.event.jpa.CallbackRegistry;
import org.hibernate.jpa.event.internal.jpa.CallbackRegistryConsumer;
import org.hibernate.jpa.event.spi.jpa.CallbackRegistry;
import org.hibernate.metadata.ClassMetadata;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.type.Type;

View File

@ -21,7 +21,7 @@
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.hibernate.jpa.internal.event.core;
package org.hibernate.jpa.event.internal.core;
import java.util.IdentityHashMap;

View File

@ -21,14 +21,14 @@
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.hibernate.jpa.internal.event.core;
package org.hibernate.jpa.event.internal.core;
import java.io.Serializable;
import org.hibernate.event.internal.DefaultMergeEventListener;
import org.hibernate.event.spi.EventSource;
import org.hibernate.jpa.internal.event.jpa.CallbackRegistryConsumer;
import org.hibernate.jpa.internal.event.jpa.CallbackRegistry;
import org.hibernate.jpa.event.internal.jpa.CallbackRegistryConsumer;
import org.hibernate.jpa.event.spi.jpa.CallbackRegistry;
/**
* Overrides the LifeCycle OnSave call to call the PrePersist operation

View File

@ -21,7 +21,7 @@
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.hibernate.jpa.internal.event.core;
package org.hibernate.jpa.event.internal.core;
import java.io.Serializable;
import java.util.Iterator;
@ -34,8 +34,8 @@ import org.hibernate.engine.spi.CascadingAction;
import org.hibernate.engine.spi.CascadingActions;
import org.hibernate.event.internal.DefaultPersistEventListener;
import org.hibernate.event.spi.EventSource;
import org.hibernate.jpa.internal.event.jpa.CallbackRegistryConsumer;
import org.hibernate.jpa.internal.event.jpa.CallbackRegistry;
import org.hibernate.jpa.event.internal.jpa.CallbackRegistryConsumer;
import org.hibernate.jpa.event.spi.jpa.CallbackRegistry;
import org.hibernate.type.CollectionType;
/**

View File

@ -21,7 +21,7 @@
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.hibernate.jpa.internal.event.core;
package org.hibernate.jpa.event.internal.core;
import org.hibernate.engine.spi.CascadingAction;
import org.hibernate.engine.spi.CascadingActions;

View File

@ -21,18 +21,19 @@
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.hibernate.jpa.internal.event.core;
package org.hibernate.jpa.event.internal.core;
import org.hibernate.event.spi.PostDeleteEvent;
import org.hibernate.event.spi.PostDeleteEventListener;
import org.hibernate.jpa.internal.event.jpa.CallbackRegistryConsumer;
import org.hibernate.jpa.internal.event.jpa.CallbackRegistry;
import org.hibernate.jpa.event.internal.jpa.CallbackRegistryConsumer;
import org.hibernate.jpa.event.spi.jpa.CallbackRegistry;
import org.hibernate.persister.entity.EntityPersister;
/**
* @author <a href="mailto:kabir.khan@jboss.org">Kabir Khan</a>
*/
public class JpaPostDeleteEventListener implements PostDeleteEventListener, CallbackRegistryConsumer {
CallbackRegistry callbackRegistry;
private CallbackRegistry callbackRegistry;
public void injectCallbackRegistry(CallbackRegistry callbackRegistry) {
this.callbackRegistry = callbackRegistry;
@ -51,4 +52,8 @@ public class JpaPostDeleteEventListener implements PostDeleteEventListener, Call
callbackRegistry.postRemove( entity );
}
@Override
public boolean requiresPostCommitHanding(EntityPersister persister) {
return callbackRegistry.hasPostRemoveCallbacks( persister.getMappedClass() );
}
}

View File

@ -21,18 +21,20 @@
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.hibernate.jpa.internal.event.core;
package org.hibernate.jpa.event.internal.core;
import org.hibernate.event.spi.PostInsertEvent;
import org.hibernate.event.spi.PostInsertEventListener;
import org.hibernate.jpa.internal.event.jpa.CallbackRegistryConsumer;
import org.hibernate.jpa.internal.event.jpa.CallbackRegistry;
import org.hibernate.jpa.event.internal.jpa.CallbackRegistryConsumer;
import org.hibernate.jpa.event.spi.jpa.CallbackRegistry;
import org.hibernate.persister.entity.EntityPersister;
/**
* @author <a href="mailto:kabir.khan@jboss.org">Kabir Khan</a>
* @author Steve Ebersole
*/
public class JpaPostInsertEventListener implements PostInsertEventListener, CallbackRegistryConsumer {
CallbackRegistry callbackRegistry;
private CallbackRegistry callbackRegistry;
@Override
public void injectCallbackRegistry(CallbackRegistry callbackRegistry) {
@ -52,4 +54,9 @@ public class JpaPostInsertEventListener implements PostInsertEventListener, Call
Object entity = event.getEntity();
callbackRegistry.postCreate( entity );
}
@Override
public boolean requiresPostCommitHanding(EntityPersister persister) {
return callbackRegistry.hasPostCreateCallbacks( persister.getMappedClass() );
}
}

View File

@ -21,12 +21,12 @@
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.hibernate.jpa.internal.event.core;
package org.hibernate.jpa.event.internal.core;
import org.hibernate.event.spi.PostLoadEvent;
import org.hibernate.event.spi.PostLoadEventListener;
import org.hibernate.jpa.internal.event.jpa.CallbackRegistryConsumer;
import org.hibernate.jpa.internal.event.jpa.CallbackRegistry;
import org.hibernate.jpa.event.internal.jpa.CallbackRegistryConsumer;
import org.hibernate.jpa.event.spi.jpa.CallbackRegistry;
/**
* @author <a href="mailto:kabir.khan@jboss.org">Kabir Khan</a>

View File

@ -21,7 +21,7 @@
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.hibernate.jpa.internal.event.core;
package org.hibernate.jpa.event.internal.core;
import org.hibernate.engine.spi.EntityEntry;
import org.hibernate.engine.spi.Status;
@ -34,8 +34,9 @@ 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.internal.event.jpa.CallbackRegistryConsumer;
import org.hibernate.jpa.internal.event.jpa.CallbackRegistry;
import org.hibernate.jpa.event.internal.jpa.CallbackRegistryConsumer;
import org.hibernate.jpa.event.spi.jpa.CallbackRegistry;
import org.hibernate.persister.entity.EntityPersister;
/**
* Implementation of the post update listeners.
@ -49,7 +50,7 @@ public class JpaPostUpdateEventListener
PostCollectionRecreateEventListener,
PostCollectionRemoveEventListener,
PostCollectionUpdateEventListener {
CallbackRegistry callbackRegistry;
private CallbackRegistry callbackRegistry;
@Override
public void injectCallbackRegistry(CallbackRegistry callbackRegistry) {
@ -80,6 +81,11 @@ public class JpaPostUpdateEventListener
}
}
@Override
public boolean requiresPostCommitHanding(EntityPersister persister) {
return callbackRegistry.hasPostUpdateCallbacks( persister.getMappedClass() );
}
@Override
public void onPostRecreateCollection(PostCollectionRecreateEvent event) {
Object entity = event.getCollection().getOwner();

View File

@ -21,14 +21,14 @@
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.hibernate.jpa.internal.event.core;
package org.hibernate.jpa.event.internal.core;
import java.io.Serializable;
import org.hibernate.event.internal.DefaultSaveEventListener;
import org.hibernate.event.spi.EventSource;
import org.hibernate.jpa.internal.event.jpa.CallbackRegistryConsumer;
import org.hibernate.jpa.internal.event.jpa.CallbackRegistry;
import org.hibernate.jpa.event.internal.jpa.CallbackRegistryConsumer;
import org.hibernate.jpa.event.spi.jpa.CallbackRegistry;
/**
* Overrides the LifeCycle OnSave call to call the PrePersist operation

View File

@ -21,14 +21,14 @@
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.hibernate.jpa.internal.event.core;
package org.hibernate.jpa.event.internal.core;
import java.io.Serializable;
import org.hibernate.event.internal.DefaultSaveOrUpdateEventListener;
import org.hibernate.event.spi.EventSource;
import org.hibernate.jpa.internal.event.jpa.CallbackRegistryConsumer;
import org.hibernate.jpa.internal.event.jpa.CallbackRegistry;
import org.hibernate.jpa.event.internal.jpa.CallbackRegistryConsumer;
import org.hibernate.jpa.event.spi.jpa.CallbackRegistry;
/**
* Overrides the LifeCycle OnSave call to call the PrePersist operation

View File

@ -21,7 +21,7 @@
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.hibernate.jpa.internal.event.core;
package org.hibernate.jpa.event.internal.core;
/**
* Hibernate EntityManager specific implementations of Hibernate event listeners. Generally the listeners

View File

@ -21,7 +21,7 @@
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.hibernate.jpa.internal.event.jpa;
package org.hibernate.jpa.event.internal.jpa;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.spi.AnnotatedType;
@ -30,6 +30,8 @@ import javax.enterprise.inject.spi.InjectionTarget;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.hibernate.jpa.event.spi.jpa.ListenerFactory;
/**
* CID-based implementation of the ListenerFactory contract. Listener instances are kept in a map keyed by Class
* to achieve singleton-ness.

View File

@ -21,7 +21,7 @@
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.hibernate.jpa.internal.event.jpa;
package org.hibernate.jpa.event.internal.jpa;
import javax.persistence.PostLoad;
import javax.persistence.PostPersist;
@ -52,7 +52,7 @@ public interface CallbackProcessor {
* @param entityObject
* @param registry
*/
public void processCallbacksForEntity(Object entityObject, CallbackRegistry registry);
public void processCallbacksForEntity(Object entityObject, CallbackRegistryImpl registry);
public void release();
}

View File

@ -21,7 +21,7 @@
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.hibernate.jpa.internal.event.jpa;
package org.hibernate.jpa.event.internal.jpa;
import java.lang.reflect.Method;
import java.util.ArrayList;
@ -30,6 +30,9 @@ import java.util.List;
import org.jboss.logging.Logger;
import org.hibernate.MappingException;
import org.hibernate.jpa.event.spi.jpa.Callback;
import org.hibernate.jpa.event.spi.jpa.CallbackRegistry;
import org.hibernate.jpa.event.spi.jpa.ListenerFactory;
import org.hibernate.metamodel.binding.EntityBinding;
import org.hibernate.metamodel.source.MetadataImplementor;
import org.hibernate.metamodel.source.binder.JpaCallbackClass;
@ -58,7 +61,7 @@ public class CallbackProcessorImpl implements CallbackProcessor {
}
@Override
public void processCallbacksForEntity(Object entityObject, CallbackRegistry callbackRegistry) {
public void processCallbacksForEntity(Object entityObject, CallbackRegistryImpl callbackRegistry) {
final EntityBinding entityBinding = (EntityBinding) entityObject;
final String entityClassName = entityBinding.getEntity().getClassName();
if ( entityClassName == null ) {

View File

@ -21,9 +21,10 @@
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.hibernate.jpa.internal.event.jpa;
package org.hibernate.jpa.event.internal.jpa;
import org.hibernate.jpa.internal.event.core.HibernateEntityManagerEventListener;
import org.hibernate.jpa.event.internal.core.HibernateEntityManagerEventListener;
import org.hibernate.jpa.event.spi.jpa.CallbackRegistry;
/**
* Contract for injecting the registry of Callbacks into event listeners.

View File

@ -21,7 +21,7 @@
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.hibernate.jpa.internal.event.jpa;
package org.hibernate.jpa.event.internal.jpa;
import javax.persistence.PersistenceException;
import javax.persistence.PostLoad;
@ -31,9 +31,11 @@ import javax.persistence.PostUpdate;
import javax.persistence.PrePersist;
import javax.persistence.PreRemove;
import javax.persistence.PreUpdate;
import java.io.Serializable;
import java.util.HashMap;
import org.hibernate.jpa.event.spi.jpa.Callback;
import org.hibernate.jpa.event.spi.jpa.CallbackRegistry;
/**
* Keep track of all lifecycle callbacks and listeners for a given persistence unit
*
@ -41,7 +43,7 @@ import java.util.HashMap;
* @author Steve Ebersole
*/
@SuppressWarnings({"unchecked", "serial"})
public class CallbackRegistry implements Serializable {
public class CallbackRegistryImpl implements CallbackRegistry {
private HashMap<Class, Callback[]> preCreates = new HashMap<Class, Callback[]>();
private HashMap<Class, Callback[]> postCreates = new HashMap<Class, Callback[]>();
private HashMap<Class, Callback[]> preRemoves = new HashMap<Class, Callback[]>();
@ -50,30 +52,56 @@ public class CallbackRegistry implements Serializable {
private HashMap<Class, Callback[]> postUpdates = new HashMap<Class, Callback[]>();
private HashMap<Class, Callback[]> postLoads = new HashMap<Class, Callback[]>();
public boolean preCreate(Object bean) {
return callback( preCreates.get( bean.getClass() ), bean );
@Override
public void preCreate(Object bean) {
callback( preCreates.get( bean.getClass() ), bean );
}
public boolean postCreate(Object bean) {
return callback( postCreates.get( bean.getClass() ), bean );
@Override
public boolean hasPostCreateCallbacks(Class entityClass) {
return notEmpty( preCreates.get( entityClass ) );
}
public boolean preRemove(Object bean) {
return callback( preRemoves.get( bean.getClass() ), bean );
private boolean notEmpty(Callback[] callbacks) {
return callbacks != null && callbacks.length > 0;
}
public boolean postRemove(Object bean) {
return callback( postRemoves.get( bean.getClass() ), bean );
@Override
public void postCreate(Object bean) {
callback( postCreates.get( bean.getClass() ), bean );
}
@Override
public boolean preUpdate(Object bean) {
return callback( preUpdates.get( bean.getClass() ), bean );
}
public boolean postUpdate(Object bean) {
return callback( postUpdates.get( bean.getClass() ), bean );
@Override
public boolean hasPostUpdateCallbacks(Class entityClass) {
return notEmpty( postUpdates.get( entityClass ) );
}
@Override
public void postUpdate(Object bean) {
callback( postUpdates.get( bean.getClass() ), bean );
}
@Override
public void preRemove(Object bean) {
callback( preRemoves.get( bean.getClass() ), bean );
}
@Override
public boolean hasPostRemoveCallbacks(Class entityClass) {
return notEmpty( postRemoves.get( entityClass ) );
}
@Override
public void postRemove(Object bean) {
callback( postRemoves.get( bean.getClass() ), bean );
}
@Override
public boolean postLoad(Object bean) {
return callback( postLoads.get( bean.getClass() ), bean );
}
@ -90,7 +118,14 @@ public class CallbackRegistry implements Serializable {
}
}
/* package */ void addEntityCallbacks(Class entityClass, Class annotationClass, Callback[] callbacks) {
/**
* Great care should be taken calling this. Not a fan of it being public, but that is needed because of
* @param entityClass
* @param annotationClass
* @param callbacks
*/
public void addEntityCallbacks(Class entityClass, Class annotationClass, Callback[] callbacks) {
final HashMap<Class, Callback[]> map = determineAppropriateCallbackMap( annotationClass );
if ( map.containsKey( entityClass ) ) {
throw new PersistenceException( "Error build callback listeners; entity [" + entityClass.getName() + " was already processed" );

View File

@ -21,11 +21,13 @@
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.hibernate.jpa.internal.event.jpa;
package org.hibernate.jpa.event.internal.jpa;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.hibernate.jpa.event.spi.jpa.Callback;
/**
* Represents a JPA callback on the entity itself
*
@ -40,9 +42,10 @@ public class EntityCallback implements Callback {
}
@Override
public void performCallback(Object entity) {
public boolean performCallback(Object entity) {
try {
callbackMethod.invoke( entity );
return true;
}
catch (InvocationTargetException e) {
//keep runtime exceptions as is
@ -58,5 +61,8 @@ public class EntityCallback implements Callback {
}
}
@Override
public boolean isActive() {
return true;
}
}

View File

@ -21,7 +21,7 @@
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.hibernate.jpa.internal.event.jpa;
package org.hibernate.jpa.event.internal.jpa;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
@ -29,13 +29,6 @@ import javax.persistence.ExcludeDefaultListeners;
import javax.persistence.ExcludeSuperclassListeners;
import javax.persistence.MappedSuperclass;
import javax.persistence.PersistenceException;
import javax.persistence.PostLoad;
import javax.persistence.PostPersist;
import javax.persistence.PostRemove;
import javax.persistence.PostUpdate;
import javax.persistence.PrePersist;
import javax.persistence.PreRemove;
import javax.persistence.PreUpdate;
import java.lang.annotation.Annotation;
import java.lang.annotation.ElementType;
@ -50,6 +43,8 @@ import org.hibernate.MappingException;
import org.hibernate.annotations.common.reflection.ReflectionManager;
import org.hibernate.annotations.common.reflection.XClass;
import org.hibernate.annotations.common.reflection.XMethod;
import org.hibernate.jpa.event.spi.jpa.Callback;
import org.hibernate.jpa.event.spi.jpa.ListenerFactory;
/**
* @author <a href="mailto:kabir.khan@jboss.org">Kabir Khan</a>
@ -67,7 +62,7 @@ public class LegacyCallbackProcessor implements CallbackProcessor {
}
@Override
public void processCallbacksForEntity(Object entityObject, CallbackRegistry callbackRegistry) {
public void processCallbacksForEntity(Object entityObject, CallbackRegistryImpl callbackRegistry) {
final String entityClassName = (String) entityObject;
try {
final XClass entityXClass = reflectionManager.classForName( entityClassName, this.getClass() );

View File

@ -21,11 +21,13 @@
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.hibernate.jpa.internal.event.jpa;
package org.hibernate.jpa.event.internal.jpa;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.hibernate.jpa.event.spi.jpa.Callback;
/**
* Represents a JPA callback using a dedicated listener
*
@ -42,9 +44,10 @@ public class ListenerCallback implements Callback {
}
@Override
public void performCallback(Object entity) {
public boolean performCallback(Object entity) {
try {
callbackMethod.invoke( listenerInstance, entity );
return true;
}
catch (InvocationTargetException e) {
//keep runtime exceptions as is
@ -59,4 +62,9 @@ public class ListenerCallback implements Callback {
throw new RuntimeException( e );
}
}
@Override
public boolean isActive() {
return true;
}
}

View File

@ -21,12 +21,14 @@
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.hibernate.jpa.internal.event.jpa;
package org.hibernate.jpa.event.internal.jpa;
import javax.persistence.PersistenceException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.hibernate.jpa.event.spi.jpa.ListenerFactory;
/**
* Standard implementation of the ListenerFactory contract using simple instantiation. Listener instances
* are kept in a map keyed by Class to achieve singleton-ness.

View File

@ -21,7 +21,7 @@
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.hibernate.jpa.internal.event.jpa;
package org.hibernate.jpa.event.internal.jpa;
/**
* Classes for integrating with JPA event callbacks

View File

@ -21,7 +21,7 @@
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.hibernate.jpa.internal.event;
package org.hibernate.jpa.event.spi;
import javax.enterprise.inject.spi.BeanManager;
import java.util.Iterator;
@ -40,28 +40,28 @@ import org.hibernate.event.service.spi.EventListenerRegistry;
import org.hibernate.event.spi.EventType;
import org.hibernate.integrator.spi.Integrator;
import org.hibernate.jpa.AvailableSettings;
import org.hibernate.jpa.internal.event.core.HibernateEntityManagerEventListener;
import org.hibernate.jpa.internal.event.core.JpaAutoFlushEventListener;
import org.hibernate.jpa.internal.event.core.JpaDeleteEventListener;
import org.hibernate.jpa.internal.event.core.JpaFlushEntityEventListener;
import org.hibernate.jpa.internal.event.core.JpaFlushEventListener;
import org.hibernate.jpa.internal.event.core.JpaMergeEventListener;
import org.hibernate.jpa.internal.event.core.JpaPersistEventListener;
import org.hibernate.jpa.internal.event.core.JpaPersistOnFlushEventListener;
import org.hibernate.jpa.internal.event.core.JpaPostDeleteEventListener;
import org.hibernate.jpa.internal.event.core.JpaPostInsertEventListener;
import org.hibernate.jpa.internal.event.core.JpaPostLoadEventListener;
import org.hibernate.jpa.internal.event.core.JpaPostUpdateEventListener;
import org.hibernate.jpa.internal.event.core.JpaSaveEventListener;
import org.hibernate.jpa.internal.event.core.JpaSaveOrUpdateEventListener;
import org.hibernate.jpa.internal.event.jpa.BeanManagerListenerFactory;
import org.hibernate.jpa.internal.event.jpa.CallbackProcessor;
import org.hibernate.jpa.internal.event.jpa.CallbackProcessorImpl;
import org.hibernate.jpa.internal.event.jpa.CallbackRegistryConsumer;
import org.hibernate.jpa.internal.event.jpa.CallbackRegistry;
import org.hibernate.jpa.internal.event.jpa.LegacyCallbackProcessor;
import org.hibernate.jpa.internal.event.jpa.ListenerFactory;
import org.hibernate.jpa.internal.event.jpa.StandardListenerFactory;
import org.hibernate.jpa.event.internal.core.HibernateEntityManagerEventListener;
import org.hibernate.jpa.event.internal.core.JpaAutoFlushEventListener;
import org.hibernate.jpa.event.internal.core.JpaDeleteEventListener;
import org.hibernate.jpa.event.internal.core.JpaFlushEntityEventListener;
import org.hibernate.jpa.event.internal.core.JpaFlushEventListener;
import org.hibernate.jpa.event.internal.core.JpaMergeEventListener;
import org.hibernate.jpa.event.internal.core.JpaPersistEventListener;
import org.hibernate.jpa.event.internal.core.JpaPersistOnFlushEventListener;
import org.hibernate.jpa.event.internal.core.JpaPostDeleteEventListener;
import org.hibernate.jpa.event.internal.core.JpaPostInsertEventListener;
import org.hibernate.jpa.event.internal.core.JpaPostLoadEventListener;
import org.hibernate.jpa.event.internal.core.JpaPostUpdateEventListener;
import org.hibernate.jpa.event.internal.core.JpaSaveEventListener;
import org.hibernate.jpa.event.internal.core.JpaSaveOrUpdateEventListener;
import org.hibernate.jpa.event.internal.jpa.BeanManagerListenerFactory;
import org.hibernate.jpa.event.internal.jpa.CallbackProcessor;
import org.hibernate.jpa.event.internal.jpa.CallbackProcessorImpl;
import org.hibernate.jpa.event.internal.jpa.CallbackRegistryConsumer;
import org.hibernate.jpa.event.internal.jpa.CallbackRegistryImpl;
import org.hibernate.jpa.event.internal.jpa.LegacyCallbackProcessor;
import org.hibernate.jpa.event.spi.jpa.ListenerFactory;
import org.hibernate.jpa.event.internal.jpa.StandardListenerFactory;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.metamodel.binding.EntityBinding;
import org.hibernate.metamodel.source.MetadataImplementor;
@ -82,7 +82,7 @@ import org.hibernate.service.spi.SessionFactoryServiceRegistry;
public class JpaIntegrator implements Integrator {
private ListenerFactory jpaListenerFactory;
private CallbackProcessor callbackProcessor;
private CallbackRegistry callbackRegistry;
private CallbackRegistryImpl callbackRegistry;
private static final DuplicationStrategy JPA_DUPLICATION_STRATEGY = new DuplicationStrategy() {
@Override
@ -186,7 +186,7 @@ public class JpaIntegrator implements Integrator {
// handle JPA "entity listener classes"...
this.callbackRegistry = new CallbackRegistry();
this.callbackRegistry = new CallbackRegistryImpl();
final BeanManager beanManager = (BeanManager) configuration.getProperties().get( AvailableSettings.CDI_BEAN_MANAGER );
this.jpaListenerFactory = beanManager == null
? new StandardListenerFactory()
@ -287,7 +287,7 @@ public class JpaIntegrator implements Integrator {
// handle JPA "entity listener classes"...
this.callbackRegistry = new CallbackRegistry();
this.callbackRegistry = new CallbackRegistryImpl();
final BeanManager beanManager = (BeanManager) sessionFactory.getProperties().get( AvailableSettings.CDI_BEAN_MANAGER );
this.jpaListenerFactory = beanManager == null
? new StandardListenerFactory()

View File

@ -21,7 +21,7 @@
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.hibernate.jpa.internal.event.jpa;
package org.hibernate.jpa.event.spi.jpa;
import java.io.Serializable;
@ -36,6 +36,15 @@ public interface Callback extends Serializable {
* Contract for performing the callback
*
* @param entity Reference to the entity for which the callback is triggered.
*
* @return Did a callback actually happen?
*/
public abstract void performCallback(Object entity);
public boolean performCallback(Object entity);
/**
* Is this callback active (will it do anything)?
*
* @return
*/
public boolean isActive();
}

View File

@ -0,0 +1,45 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2012, Red Hat Inc. or third-party contributors as
* indicated by the @author tags or express copyright attribution
* statements applied by the authors. All third-party contributions are
* distributed under license by Red Hat Inc.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
* Lesser General Public License, as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution; if not, write to:
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.hibernate.jpa.event.spi.jpa;
import java.io.Serializable;
/**
* @author Steve Ebersole
*/
public interface CallbackRegistry extends Serializable {
public void preCreate(Object entity);
public boolean hasPostCreateCallbacks(Class entityClass);
public void postCreate(Object entity);
public boolean preUpdate(Object entity);
public boolean hasPostUpdateCallbacks(Class entityClass);
public void postUpdate(Object entity);
public void preRemove(Object entity);
public boolean hasPostRemoveCallbacks(Class entityClass);
public void postRemove(Object entity);
public boolean postLoad(Object entity);
}

View File

@ -21,7 +21,7 @@
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.hibernate.jpa.internal.event.jpa;
package org.hibernate.jpa.event.spi.jpa;
/**
* Factory for building instances user-specified event listeners.

View File

@ -0,0 +1,28 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2012, Red Hat Inc. or third-party contributors as
* indicated by the @author tags or express copyright attribution
* statements applied by the authors. All third-party contributions are
* distributed under license by Red Hat Inc.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
* Lesser General Public License, as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution; if not, write to:
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.hibernate.jpa.event.spi.jpa;
/**
* SPI classes for integrating with JPA event callbacks
*/

View File

@ -29,6 +29,7 @@ import org.hibernate.envers.synchronization.work.AuditWorkUnit;
import org.hibernate.envers.synchronization.work.DelWorkUnit;
import org.hibernate.event.spi.PostDeleteEvent;
import org.hibernate.event.spi.PostDeleteEventListener;
import org.hibernate.persister.entity.EntityPersister;
/**
* @author Adam Warski (adam at warski dot org)
@ -71,4 +72,9 @@ public class EnversPostDeleteEventListenerImpl extends BaseEnversEventListener i
}
}
}
@Override
public boolean requiresPostCommitHanding(EntityPersister persister) {
return getAuditConfiguration().getEntCfg().isVersioned( persister.getEntityName() );
}
}

View File

@ -29,6 +29,7 @@ import org.hibernate.envers.synchronization.work.AddWorkUnit;
import org.hibernate.envers.synchronization.work.AuditWorkUnit;
import org.hibernate.event.spi.PostInsertEvent;
import org.hibernate.event.spi.PostInsertEventListener;
import org.hibernate.persister.entity.EntityPersister;
/**
* @author Adam Warski (adam at warski dot org)
@ -70,4 +71,9 @@ public class EnversPostInsertEventListenerImpl extends BaseEnversEventListener i
}
}
}
@Override
public boolean requiresPostCommitHanding(EntityPersister persister) {
return getAuditConfiguration().getEntCfg().isVersioned( persister.getEntityName() );
}
}

View File

@ -88,4 +88,9 @@ public class EnversPostUpdateEventListenerImpl extends BaseEnversEventListener i
}
return newDbState;
}
@Override
public boolean requiresPostCommitHanding(EntityPersister persister) {
return getAuditConfiguration().getEntCfg().isVersioned( persister.getEntityName() );
}
}