HHH-11264 - Unify native and JPA implementations of Hibernate event listeners
This commit is contained in:
parent
8f889e95d7
commit
55e73c7202
|
@ -173,14 +173,6 @@ public class MetadataBuilderImpl implements MetadataBuilderImplementor, TypeCont
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
// @Override
|
|
||||||
// public MetadataBuilder applyReflectionManager(ReflectionManager reflectionManager) {
|
|
||||||
// bootstrapContext.
|
|
||||||
// this.options.reflectionManager = reflectionManager;
|
|
||||||
// this.options.reflectionManager.injectClassLoaderDelegate( this.options.getHcannClassLoaderDelegate() );
|
|
||||||
// return this;
|
|
||||||
// }
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MetadataBuilder applySharedCacheMode(SharedCacheMode sharedCacheMode) {
|
public MetadataBuilder applySharedCacheMode(SharedCacheMode sharedCacheMode) {
|
||||||
this.options.sharedCacheMode = sharedCacheMode;
|
this.options.sharedCacheMode = sharedCacheMode;
|
||||||
|
|
|
@ -471,7 +471,7 @@ public class CascadingActions {
|
||||||
*
|
*
|
||||||
* @return The children iterator.
|
* @return The children iterator.
|
||||||
*/
|
*/
|
||||||
private static Iterator getAllElementsIterator(
|
public static Iterator getAllElementsIterator(
|
||||||
EventSource session,
|
EventSource session,
|
||||||
CollectionType collectionType,
|
CollectionType collectionType,
|
||||||
Object collection) {
|
Object collection) {
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
package org.hibernate.event.internal;
|
package org.hibernate.event.internal;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
import java.util.IdentityHashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.hibernate.HibernateException;
|
import org.hibernate.HibernateException;
|
||||||
|
@ -28,6 +29,7 @@ import org.hibernate.engine.spi.PersistenceContext;
|
||||||
import org.hibernate.engine.spi.SessionImplementor;
|
import org.hibernate.engine.spi.SessionImplementor;
|
||||||
import org.hibernate.engine.spi.Status;
|
import org.hibernate.engine.spi.Status;
|
||||||
import org.hibernate.event.service.spi.EventListenerRegistry;
|
import org.hibernate.event.service.spi.EventListenerRegistry;
|
||||||
|
import org.hibernate.event.service.spi.JpaBootstrapSensitive;
|
||||||
import org.hibernate.event.spi.EventSource;
|
import org.hibernate.event.spi.EventSource;
|
||||||
import org.hibernate.event.spi.EventType;
|
import org.hibernate.event.spi.EventType;
|
||||||
import org.hibernate.event.spi.FlushEntityEvent;
|
import org.hibernate.event.spi.FlushEntityEvent;
|
||||||
|
@ -46,10 +48,17 @@ import org.jboss.logging.Logger;
|
||||||
*
|
*
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public abstract class AbstractFlushingEventListener implements Serializable {
|
public abstract class AbstractFlushingEventListener implements JpaBootstrapSensitive, Serializable {
|
||||||
|
|
||||||
private static final CoreMessageLogger LOG = Logger.getMessageLogger( CoreMessageLogger.class, AbstractFlushingEventListener.class.getName() );
|
private static final CoreMessageLogger LOG = Logger.getMessageLogger( CoreMessageLogger.class, AbstractFlushingEventListener.class.getName() );
|
||||||
|
|
||||||
|
private boolean jpaBootstrap;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void wasJpaBootstrap(boolean wasJpaBootstrap) {
|
||||||
|
this.jpaBootstrap = wasJpaBootstrap;
|
||||||
|
}
|
||||||
|
|
||||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
// Pre-flushing section
|
// Pre-flushing section
|
||||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
@ -155,11 +164,21 @@ public abstract class AbstractFlushingEventListener implements Serializable {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Object getAnything() {
|
protected Object getAnything() {
|
||||||
return null;
|
if ( jpaBootstrap ) {
|
||||||
|
return new IdentityHashMap( 10 );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected CascadingAction getCascadingAction() {
|
protected CascadingAction getCascadingAction() {
|
||||||
return CascadingActions.SAVE_UPDATE;
|
if ( jpaBootstrap ) {
|
||||||
|
return CascadingActions.PERSIST_ON_FLUSH;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return CascadingActions.SAVE_UPDATE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -32,6 +32,8 @@ import org.hibernate.id.IdentifierGenerationException;
|
||||||
import org.hibernate.id.IdentifierGeneratorHelper;
|
import org.hibernate.id.IdentifierGeneratorHelper;
|
||||||
import org.hibernate.internal.CoreLogging;
|
import org.hibernate.internal.CoreLogging;
|
||||||
import org.hibernate.internal.CoreMessageLogger;
|
import org.hibernate.internal.CoreMessageLogger;
|
||||||
|
import org.hibernate.jpa.event.spi.CallbackRegistry;
|
||||||
|
import org.hibernate.jpa.event.spi.CallbackRegistryConsumer;
|
||||||
import org.hibernate.persister.entity.EntityPersister;
|
import org.hibernate.persister.entity.EntityPersister;
|
||||||
import org.hibernate.pretty.MessageHelper;
|
import org.hibernate.pretty.MessageHelper;
|
||||||
import org.hibernate.type.Type;
|
import org.hibernate.type.Type;
|
||||||
|
@ -45,13 +47,21 @@ import static org.hibernate.FlushMode.MANUAL;
|
||||||
*
|
*
|
||||||
* @author Steve Ebersole.
|
* @author Steve Ebersole.
|
||||||
*/
|
*/
|
||||||
public abstract class AbstractSaveEventListener extends AbstractReassociateEventListener {
|
public abstract class AbstractSaveEventListener
|
||||||
|
extends AbstractReassociateEventListener
|
||||||
|
implements CallbackRegistryConsumer {
|
||||||
private static final CoreMessageLogger LOG = CoreLogging.messageLogger( AbstractSaveEventListener.class );
|
private static final CoreMessageLogger LOG = CoreLogging.messageLogger( AbstractSaveEventListener.class );
|
||||||
|
|
||||||
public static enum EntityState {
|
public enum EntityState {
|
||||||
PERSISTENT, TRANSIENT, DETACHED, DELETED
|
PERSISTENT, TRANSIENT, DETACHED, DELETED
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private CallbackRegistry callbackRegistry;
|
||||||
|
|
||||||
|
public void injectCallbackRegistry(CallbackRegistry callbackRegistry) {
|
||||||
|
this.callbackRegistry = callbackRegistry;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Prepares the save call using the given requested id.
|
* Prepares the save call using the given requested id.
|
||||||
*
|
*
|
||||||
|
@ -69,6 +79,8 @@ public abstract class AbstractSaveEventListener extends AbstractReassociateEvent
|
||||||
String entityName,
|
String entityName,
|
||||||
Object anything,
|
Object anything,
|
||||||
EventSource source) {
|
EventSource source) {
|
||||||
|
callbackRegistry.preCreate( entity );
|
||||||
|
|
||||||
return performSave(
|
return performSave(
|
||||||
entity,
|
entity,
|
||||||
requestedId,
|
requestedId,
|
||||||
|
@ -101,6 +113,8 @@ public abstract class AbstractSaveEventListener extends AbstractReassociateEvent
|
||||||
Object anything,
|
Object anything,
|
||||||
EventSource source,
|
EventSource source,
|
||||||
boolean requiresImmediateIdAccess) {
|
boolean requiresImmediateIdAccess) {
|
||||||
|
callbackRegistry.preCreate( entity );
|
||||||
|
|
||||||
if ( entity instanceof SelfDirtinessTracker ) {
|
if ( entity instanceof SelfDirtinessTracker ) {
|
||||||
( (SelfDirtinessTracker) entity ).$$_hibernate_clearDirtyAttributes();
|
( (SelfDirtinessTracker) entity ).$$_hibernate_clearDirtyAttributes();
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,12 +25,15 @@ import org.hibernate.engine.spi.EntityEntry;
|
||||||
import org.hibernate.engine.spi.EntityKey;
|
import org.hibernate.engine.spi.EntityKey;
|
||||||
import org.hibernate.engine.spi.PersistenceContext;
|
import org.hibernate.engine.spi.PersistenceContext;
|
||||||
import org.hibernate.engine.spi.Status;
|
import org.hibernate.engine.spi.Status;
|
||||||
|
import org.hibernate.event.service.spi.JpaBootstrapSensitive;
|
||||||
import org.hibernate.event.spi.DeleteEvent;
|
import org.hibernate.event.spi.DeleteEvent;
|
||||||
import org.hibernate.event.spi.DeleteEventListener;
|
import org.hibernate.event.spi.DeleteEventListener;
|
||||||
import org.hibernate.event.spi.EventSource;
|
import org.hibernate.event.spi.EventSource;
|
||||||
import org.hibernate.internal.CoreLogging;
|
import org.hibernate.internal.CoreLogging;
|
||||||
import org.hibernate.internal.CoreMessageLogger;
|
import org.hibernate.internal.CoreMessageLogger;
|
||||||
import org.hibernate.internal.util.collections.IdentitySet;
|
import org.hibernate.internal.util.collections.IdentitySet;
|
||||||
|
import org.hibernate.jpa.event.spi.CallbackRegistry;
|
||||||
|
import org.hibernate.jpa.event.spi.CallbackRegistryConsumer;
|
||||||
import org.hibernate.persister.entity.EntityPersister;
|
import org.hibernate.persister.entity.EntityPersister;
|
||||||
import org.hibernate.pretty.MessageHelper;
|
import org.hibernate.pretty.MessageHelper;
|
||||||
import org.hibernate.type.Type;
|
import org.hibernate.type.Type;
|
||||||
|
@ -42,9 +45,22 @@ import org.hibernate.type.TypeHelper;
|
||||||
*
|
*
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public class DefaultDeleteEventListener implements DeleteEventListener {
|
public class DefaultDeleteEventListener implements DeleteEventListener, CallbackRegistryConsumer, JpaBootstrapSensitive {
|
||||||
private static final CoreMessageLogger LOG = CoreLogging.messageLogger( DefaultDeleteEventListener.class );
|
private static final CoreMessageLogger LOG = CoreLogging.messageLogger( DefaultDeleteEventListener.class );
|
||||||
|
|
||||||
|
private CallbackRegistry callbackRegistry;
|
||||||
|
private boolean jpaBootstrap;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void injectCallbackRegistry(CallbackRegistry callbackRegistry) {
|
||||||
|
this.callbackRegistry = callbackRegistry;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void wasJpaBootstrap(boolean wasJpaBootstrap) {
|
||||||
|
this.jpaBootstrap = wasJpaBootstrap;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle the given delete event.
|
* Handle the given delete event.
|
||||||
*
|
*
|
||||||
|
@ -163,10 +179,22 @@ public class DefaultDeleteEventListener implements DeleteEventListener {
|
||||||
* @param event The event.
|
* @param event The event.
|
||||||
*/
|
*/
|
||||||
protected void performDetachedEntityDeletionCheck(DeleteEvent event) {
|
protected void performDetachedEntityDeletionCheck(DeleteEvent event) {
|
||||||
|
if ( jpaBootstrap ) {
|
||||||
|
disallowDeletionOfDetached( event );
|
||||||
|
}
|
||||||
// ok in normal Hibernate usage to delete a detached entity; JPA however
|
// ok in normal Hibernate usage to delete a detached entity; JPA however
|
||||||
// forbids it, thus this is a hook for HEM to affect this behavior
|
// forbids it, thus this is a hook for HEM to affect this behavior
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void disallowDeletionOfDetached(DeleteEvent event) {
|
||||||
|
EventSource source = event.getSession();
|
||||||
|
String entityName = event.getEntityName();
|
||||||
|
EntityPersister persister = source.getEntityPersister( entityName, event.getObject() );
|
||||||
|
Serializable id = persister.getIdentifier( event.getObject(), source );
|
||||||
|
entityName = entityName == null ? source.guessEntityName( event.getObject() ) : entityName;
|
||||||
|
throw new IllegalArgumentException("Removing a detached instance "+ entityName + "#" + id);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* We encountered a delete request on a transient instance.
|
* We encountered a delete request on a transient instance.
|
||||||
* <p/>
|
* <p/>
|
||||||
|
@ -310,6 +338,8 @@ public class DefaultDeleteEventListener implements DeleteEventListener {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected boolean invokeDeleteLifecycle(EventSource session, Object entity, EntityPersister persister) {
|
protected boolean invokeDeleteLifecycle(EventSource session, Object entity, EntityPersister persister) {
|
||||||
|
callbackRegistry.preRemove( entity );
|
||||||
|
|
||||||
if ( persister.implementsLifecycle() ) {
|
if ( persister.implementsLifecycle() ) {
|
||||||
LOG.debug( "Calling onDelete()" );
|
LOG.debug( "Calling onDelete()" );
|
||||||
if ( ( (Lifecycle) entity ).onDelete( session ) ) {
|
if ( ( (Lifecycle) entity ).onDelete( session ) ) {
|
||||||
|
|
|
@ -12,10 +12,11 @@ import java.util.Arrays;
|
||||||
import org.hibernate.AssertionFailure;
|
import org.hibernate.AssertionFailure;
|
||||||
import org.hibernate.CustomEntityDirtinessStrategy;
|
import org.hibernate.CustomEntityDirtinessStrategy;
|
||||||
import org.hibernate.HibernateException;
|
import org.hibernate.HibernateException;
|
||||||
import org.hibernate.Session;
|
import org.hibernate.SessionFactory;
|
||||||
import org.hibernate.StaleObjectStateException;
|
import org.hibernate.StaleObjectStateException;
|
||||||
import org.hibernate.action.internal.DelayedPostInsertIdentifier;
|
import org.hibernate.action.internal.DelayedPostInsertIdentifier;
|
||||||
import org.hibernate.action.internal.EntityUpdateAction;
|
import org.hibernate.action.internal.EntityUpdateAction;
|
||||||
|
import org.hibernate.bytecode.enhance.spi.LazyPropertyInitializer;
|
||||||
import org.hibernate.engine.internal.Nullability;
|
import org.hibernate.engine.internal.Nullability;
|
||||||
import org.hibernate.engine.internal.Versioning;
|
import org.hibernate.engine.internal.Versioning;
|
||||||
import org.hibernate.engine.spi.EntityEntry;
|
import org.hibernate.engine.spi.EntityEntry;
|
||||||
|
@ -29,6 +30,9 @@ import org.hibernate.event.spi.FlushEntityEventListener;
|
||||||
import org.hibernate.internal.CoreLogging;
|
import org.hibernate.internal.CoreLogging;
|
||||||
import org.hibernate.internal.CoreMessageLogger;
|
import org.hibernate.internal.CoreMessageLogger;
|
||||||
import org.hibernate.internal.util.collections.ArrayHelper;
|
import org.hibernate.internal.util.collections.ArrayHelper;
|
||||||
|
import org.hibernate.jpa.event.spi.CallbackRegistry;
|
||||||
|
import org.hibernate.jpa.event.spi.CallbackRegistryConsumer;
|
||||||
|
import org.hibernate.metadata.ClassMetadata;
|
||||||
import org.hibernate.persister.entity.EntityPersister;
|
import org.hibernate.persister.entity.EntityPersister;
|
||||||
import org.hibernate.pretty.MessageHelper;
|
import org.hibernate.pretty.MessageHelper;
|
||||||
import org.hibernate.type.Type;
|
import org.hibernate.type.Type;
|
||||||
|
@ -38,9 +42,16 @@ import org.hibernate.type.Type;
|
||||||
*
|
*
|
||||||
* @author Gavin King
|
* @author Gavin King
|
||||||
*/
|
*/
|
||||||
public class DefaultFlushEntityEventListener implements FlushEntityEventListener {
|
public class DefaultFlushEntityEventListener implements FlushEntityEventListener, CallbackRegistryConsumer {
|
||||||
private static final CoreMessageLogger LOG = CoreLogging.messageLogger( DefaultFlushEntityEventListener.class );
|
private static final CoreMessageLogger LOG = CoreLogging.messageLogger( DefaultFlushEntityEventListener.class );
|
||||||
|
|
||||||
|
private CallbackRegistry callbackRegistry;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void injectCallbackRegistry(CallbackRegistry callbackRegistry) {
|
||||||
|
this.callbackRegistry = callbackRegistry;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* make sure user didn't mangle the id
|
* make sure user didn't mangle the id
|
||||||
*/
|
*/
|
||||||
|
@ -341,7 +352,14 @@ public class DefaultFlushEntityEventListener implements FlushEntityEventListener
|
||||||
EntityEntry entry,
|
EntityEntry entry,
|
||||||
final Object[] values,
|
final Object[] values,
|
||||||
EntityPersister persister) {
|
EntityPersister persister) {
|
||||||
return session.getInterceptor().onFlushDirty(
|
boolean isDirty = false;
|
||||||
|
if ( entry.getStatus() != Status.DELETED ) {
|
||||||
|
if ( callbackRegistry.preUpdate( entity ) ) {
|
||||||
|
isDirty = copyState( entity, persister.getPropertyTypes(), values, session.getFactory() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
final boolean answerFromInterceptor = session.getInterceptor().onFlushDirty(
|
||||||
entity,
|
entity,
|
||||||
entry.getId(),
|
entry.getId(),
|
||||||
values,
|
values,
|
||||||
|
@ -349,6 +367,25 @@ public class DefaultFlushEntityEventListener implements FlushEntityEventListener
|
||||||
persister.getPropertyNames(),
|
persister.getPropertyNames(),
|
||||||
persister.getPropertyTypes()
|
persister.getPropertyTypes()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
return answerFromInterceptor || isDirty;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean copyState(Object entity, Type[] types, Object[] state, SessionFactory sf) {
|
||||||
|
// copy the entity state into the state array and return true if the state has changed
|
||||||
|
ClassMetadata metadata = sf.getClassMetadata( entity.getClass() );
|
||||||
|
Object[] newState = metadata.getPropertyValues( entity );
|
||||||
|
int size = newState.length;
|
||||||
|
boolean isDirty = false;
|
||||||
|
for ( int index = 0; index < size; index++ ) {
|
||||||
|
if ( ( state[index] == LazyPropertyInitializer.UNFETCHED_PROPERTY &&
|
||||||
|
newState[index] != LazyPropertyInitializer.UNFETCHED_PROPERTY ) ||
|
||||||
|
( state[index] != newState[index] && !types[index].isEqual( state[index], newState[index] ) ) ) {
|
||||||
|
isDirty = true;
|
||||||
|
state[index] = newState[index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return isDirty;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -499,7 +536,7 @@ public class DefaultFlushEntityEventListener implements FlushEntityEventListener
|
||||||
else {
|
else {
|
||||||
// see if the custom dirtiness strategy can tell us...
|
// see if the custom dirtiness strategy can tell us...
|
||||||
class DirtyCheckContextImpl implements CustomEntityDirtinessStrategy.DirtyCheckContext {
|
class DirtyCheckContextImpl implements CustomEntityDirtinessStrategy.DirtyCheckContext {
|
||||||
int[] found;
|
private int[] found;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void doDirtyChecking(CustomEntityDirtinessStrategy.AttributeChecker attributeChecker) {
|
public void doDirtyChecking(CustomEntityDirtinessStrategy.AttributeChecker attributeChecker) {
|
||||||
|
@ -513,7 +550,7 @@ public class DefaultFlushEntityEventListener implements FlushEntityEventListener
|
||||||
session.getFactory().getCustomEntityDirtinessStrategy().findDirty(
|
session.getFactory().getCustomEntityDirtinessStrategy().findDirty(
|
||||||
entity,
|
entity,
|
||||||
persister,
|
persister,
|
||||||
(Session) session,
|
session,
|
||||||
context
|
context
|
||||||
);
|
);
|
||||||
dirtyProperties = context.found;
|
dirtyProperties = context.found;
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.event.internal;
|
package org.hibernate.event.internal;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
import java.util.IdentityHashMap;
|
import java.util.IdentityHashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
@ -23,6 +24,8 @@ import org.hibernate.event.spi.PersistEventListener;
|
||||||
import org.hibernate.id.ForeignGenerator;
|
import org.hibernate.id.ForeignGenerator;
|
||||||
import org.hibernate.internal.CoreLogging;
|
import org.hibernate.internal.CoreLogging;
|
||||||
import org.hibernate.internal.CoreMessageLogger;
|
import org.hibernate.internal.CoreMessageLogger;
|
||||||
|
import org.hibernate.jpa.event.spi.CallbackRegistry;
|
||||||
|
import org.hibernate.jpa.event.spi.CallbackRegistryConsumer;
|
||||||
import org.hibernate.persister.entity.EntityPersister;
|
import org.hibernate.persister.entity.EntityPersister;
|
||||||
import org.hibernate.pretty.MessageHelper;
|
import org.hibernate.pretty.MessageHelper;
|
||||||
import org.hibernate.proxy.HibernateProxy;
|
import org.hibernate.proxy.HibernateProxy;
|
||||||
|
@ -34,7 +37,9 @@ import org.hibernate.proxy.LazyInitializer;
|
||||||
*
|
*
|
||||||
* @author Gavin King
|
* @author Gavin King
|
||||||
*/
|
*/
|
||||||
public class DefaultPersistEventListener extends AbstractSaveEventListener implements PersistEventListener {
|
public class DefaultPersistEventListener
|
||||||
|
extends AbstractSaveEventListener
|
||||||
|
implements PersistEventListener, CallbackRegistryConsumer {
|
||||||
private static final CoreMessageLogger LOG = CoreLogging.messageLogger( DefaultPersistEventListener.class );
|
private static final CoreMessageLogger LOG = CoreLogging.messageLogger( DefaultPersistEventListener.class );
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -52,7 +57,6 @@ public class DefaultPersistEventListener extends AbstractSaveEventListener imple
|
||||||
*
|
*
|
||||||
* @param event The create event to be handled.
|
* @param event The create event to be handled.
|
||||||
*
|
*
|
||||||
* @throws HibernateException
|
|
||||||
*/
|
*/
|
||||||
public void onPersist(PersistEvent event) throws HibernateException {
|
public void onPersist(PersistEvent event) throws HibernateException {
|
||||||
onPersist( event, new IdentityHashMap( 10 ) );
|
onPersist( event, new IdentityHashMap( 10 ) );
|
||||||
|
@ -63,7 +67,6 @@ public class DefaultPersistEventListener extends AbstractSaveEventListener imple
|
||||||
*
|
*
|
||||||
* @param event The create event to be handled.
|
* @param event The create event to be handled.
|
||||||
*
|
*
|
||||||
* @throws HibernateException
|
|
||||||
*/
|
*/
|
||||||
public void onPersist(PersistEvent event, Map createCache) throws HibernateException {
|
public void onPersist(PersistEvent event, Map createCache) throws HibernateException {
|
||||||
final SessionImplementor source = event.getSession();
|
final SessionImplementor source = event.getSession();
|
||||||
|
|
|
@ -14,6 +14,8 @@ import org.hibernate.classic.Lifecycle;
|
||||||
import org.hibernate.engine.spi.EntityEntry;
|
import org.hibernate.engine.spi.EntityEntry;
|
||||||
import org.hibernate.event.spi.PostLoadEvent;
|
import org.hibernate.event.spi.PostLoadEvent;
|
||||||
import org.hibernate.event.spi.PostLoadEventListener;
|
import org.hibernate.event.spi.PostLoadEventListener;
|
||||||
|
import org.hibernate.jpa.event.spi.CallbackRegistry;
|
||||||
|
import org.hibernate.jpa.event.spi.CallbackRegistryConsumer;
|
||||||
import org.hibernate.persister.entity.EntityPersister;
|
import org.hibernate.persister.entity.EntityPersister;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -25,10 +27,20 @@ import org.hibernate.persister.entity.EntityPersister;
|
||||||
* @author Gavin King
|
* @author Gavin King
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public class DefaultPostLoadEventListener implements PostLoadEventListener {
|
public class DefaultPostLoadEventListener implements PostLoadEventListener, CallbackRegistryConsumer {
|
||||||
|
private CallbackRegistry callbackRegistry;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void injectCallbackRegistry(CallbackRegistry callbackRegistry) {
|
||||||
|
this.callbackRegistry = callbackRegistry;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPostLoad(PostLoadEvent event) {
|
public void onPostLoad(PostLoadEvent event) {
|
||||||
final Object entity = event.getEntity();
|
final Object entity = event.getEntity();
|
||||||
|
|
||||||
|
callbackRegistry.postLoad( entity );
|
||||||
|
|
||||||
final EntityEntry entry = event.getSession().getPersistenceContext().getEntry( entity );
|
final EntityEntry entry = event.getSession().getPersistenceContext().getEntry( entity );
|
||||||
if ( entry == null ) {
|
if ( entry == null ) {
|
||||||
throw new AssertionFailure( "possible non-threadsafe access to the session" );
|
throw new AssertionFailure( "possible non-threadsafe access to the session" );
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* 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>.
|
* 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;
|
package org.hibernate.event.internal;
|
||||||
|
|
||||||
import org.hibernate.event.spi.PostDeleteEvent;
|
import org.hibernate.event.spi.PostDeleteEvent;
|
||||||
import org.hibernate.event.spi.PostDeleteEventListener;
|
import org.hibernate.event.spi.PostDeleteEventListener;
|
||||||
|
@ -14,23 +14,18 @@ import org.hibernate.jpa.event.spi.CallbackType;
|
||||||
import org.hibernate.persister.entity.EntityPersister;
|
import org.hibernate.persister.entity.EntityPersister;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* The standard PostDeleteEventListener implementation
|
||||||
|
*
|
||||||
* @author <a href="mailto:kabir.khan@jboss.org">Kabir Khan</a>
|
* @author <a href="mailto:kabir.khan@jboss.org">Kabir Khan</a>
|
||||||
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public class JpaPostDeleteEventListener implements PostDeleteEventListener, CallbackRegistryConsumer {
|
public class PostDeleteEventListenerStandardImpl implements PostDeleteEventListener, CallbackRegistryConsumer {
|
||||||
private CallbackRegistry callbackRegistry;
|
private CallbackRegistry callbackRegistry;
|
||||||
|
|
||||||
public void injectCallbackRegistry(CallbackRegistry callbackRegistry) {
|
public void injectCallbackRegistry(CallbackRegistry callbackRegistry) {
|
||||||
this.callbackRegistry = callbackRegistry;
|
this.callbackRegistry = callbackRegistry;
|
||||||
}
|
}
|
||||||
|
|
||||||
public JpaPostDeleteEventListener() {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
public JpaPostDeleteEventListener(CallbackRegistry callbackRegistry) {
|
|
||||||
this.callbackRegistry = callbackRegistry;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onPostDelete(PostDeleteEvent event) {
|
public void onPostDelete(PostDeleteEvent event) {
|
||||||
Object entity = event.getEntity();
|
Object entity = event.getEntity();
|
||||||
callbackRegistry.postRemove( entity );
|
callbackRegistry.postRemove( entity );
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* 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>.
|
* 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;
|
package org.hibernate.event.internal;
|
||||||
|
|
||||||
import org.hibernate.event.spi.PostInsertEvent;
|
import org.hibernate.event.spi.PostInsertEvent;
|
||||||
import org.hibernate.event.spi.PostInsertEventListener;
|
import org.hibernate.event.spi.PostInsertEventListener;
|
||||||
|
@ -17,7 +17,7 @@ import org.hibernate.persister.entity.EntityPersister;
|
||||||
* @author <a href="mailto:kabir.khan@jboss.org">Kabir Khan</a>
|
* @author <a href="mailto:kabir.khan@jboss.org">Kabir Khan</a>
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public class JpaPostInsertEventListener implements PostInsertEventListener, CallbackRegistryConsumer {
|
public class PostInsertEventListenerStandardImpl implements PostInsertEventListener, CallbackRegistryConsumer {
|
||||||
private CallbackRegistry callbackRegistry;
|
private CallbackRegistry callbackRegistry;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -25,14 +25,6 @@ public class JpaPostInsertEventListener implements PostInsertEventListener, Call
|
||||||
this.callbackRegistry = callbackRegistry;
|
this.callbackRegistry = callbackRegistry;
|
||||||
}
|
}
|
||||||
|
|
||||||
public JpaPostInsertEventListener() {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
public JpaPostInsertEventListener(CallbackRegistry callbackRegistry) {
|
|
||||||
this.callbackRegistry = callbackRegistry;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPostInsert(PostInsertEvent event) {
|
public void onPostInsert(PostInsertEvent event) {
|
||||||
Object entity = event.getEntity();
|
Object entity = event.getEntity();
|
|
@ -0,0 +1,49 @@
|
||||||
|
/*
|
||||||
|
* 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.event.internal;
|
||||||
|
|
||||||
|
import org.hibernate.engine.spi.EntityEntry;
|
||||||
|
import org.hibernate.engine.spi.Status;
|
||||||
|
import org.hibernate.event.spi.EventSource;
|
||||||
|
import org.hibernate.event.spi.PostUpdateEvent;
|
||||||
|
import org.hibernate.event.spi.PostUpdateEventListener;
|
||||||
|
import org.hibernate.jpa.event.spi.CallbackRegistry;
|
||||||
|
import org.hibernate.jpa.event.spi.CallbackRegistryConsumer;
|
||||||
|
import org.hibernate.jpa.event.spi.CallbackType;
|
||||||
|
import org.hibernate.persister.entity.EntityPersister;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Steve Ebersole
|
||||||
|
*/
|
||||||
|
public class PostUpdateEventListenerStandardImpl implements PostUpdateEventListener, CallbackRegistryConsumer {
|
||||||
|
private CallbackRegistry callbackRegistry;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void injectCallbackRegistry(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 = 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 );
|
||||||
|
}
|
||||||
|
}
|
|
@ -16,19 +16,24 @@ import java.util.Set;
|
||||||
import org.hibernate.event.service.spi.DuplicationStrategy;
|
import org.hibernate.event.service.spi.DuplicationStrategy;
|
||||||
import org.hibernate.event.service.spi.EventListenerGroup;
|
import org.hibernate.event.service.spi.EventListenerGroup;
|
||||||
import org.hibernate.event.service.spi.EventListenerRegistrationException;
|
import org.hibernate.event.service.spi.EventListenerRegistrationException;
|
||||||
|
import org.hibernate.event.service.spi.JpaBootstrapSensitive;
|
||||||
import org.hibernate.event.spi.EventType;
|
import org.hibernate.event.spi.EventType;
|
||||||
|
import org.hibernate.jpa.event.spi.CallbackRegistryConsumer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public class EventListenerGroupImpl<T> implements EventListenerGroup<T> {
|
class EventListenerGroupImpl<T> implements EventListenerGroup<T> {
|
||||||
private EventType<T> eventType;
|
private EventType<T> eventType;
|
||||||
|
private final EventListenerRegistryImpl listenerRegistry;
|
||||||
|
|
||||||
private final Set<DuplicationStrategy> duplicationStrategies = new LinkedHashSet<DuplicationStrategy>();
|
private final Set<DuplicationStrategy> duplicationStrategies = new LinkedHashSet<>();
|
||||||
private List<T> listeners;
|
private List<T> listeners;
|
||||||
|
|
||||||
public EventListenerGroupImpl(EventType<T> eventType) {
|
public EventListenerGroupImpl(EventType<T> eventType, EventListenerRegistryImpl listenerRegistry) {
|
||||||
this.eventType = eventType;
|
this.eventType = eventType;
|
||||||
|
this.listenerRegistry = listenerRegistry;
|
||||||
|
|
||||||
duplicationStrategies.add(
|
duplicationStrategies.add(
|
||||||
// At minimum make sure we do not register the same exact listener class multiple times.
|
// At minimum make sure we do not register the same exact listener class multiple times.
|
||||||
new DuplicationStrategy() {
|
new DuplicationStrategy() {
|
||||||
|
@ -76,11 +81,12 @@ public class EventListenerGroupImpl<T> implements EventListenerGroup<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
public Iterable<T> listeners() {
|
public Iterable<T> listeners() {
|
||||||
return listeners == null ? Collections.<T>emptyList() : listeners;
|
return listeners == null ? Collections.emptyList() : listeners;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void appendListeners(T... listeners) {
|
@SafeVarargs
|
||||||
|
public final void appendListeners(T... listeners) {
|
||||||
for ( T listener : listeners ) {
|
for ( T listener : listeners ) {
|
||||||
appendListener( listener );
|
appendListener( listener );
|
||||||
}
|
}
|
||||||
|
@ -94,7 +100,8 @@ public class EventListenerGroupImpl<T> implements EventListenerGroup<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void prependListeners(T... listeners) {
|
@SafeVarargs
|
||||||
|
public final void prependListeners(T... listeners) {
|
||||||
for ( T listener : listeners ) {
|
for ( T listener : listeners ) {
|
||||||
prependListener( listener );
|
prependListener( listener );
|
||||||
}
|
}
|
||||||
|
@ -109,7 +116,7 @@ public class EventListenerGroupImpl<T> implements EventListenerGroup<T> {
|
||||||
|
|
||||||
private boolean listenerShouldGetAdded(T listener) {
|
private boolean listenerShouldGetAdded(T listener) {
|
||||||
if ( listeners == null ) {
|
if ( listeners == null ) {
|
||||||
listeners = new ArrayList<T>();
|
listeners = new ArrayList<>();
|
||||||
return true;
|
return true;
|
||||||
// no need to do de-dup checks
|
// no need to do de-dup checks
|
||||||
}
|
}
|
||||||
|
@ -143,9 +150,22 @@ public class EventListenerGroupImpl<T> implements EventListenerGroup<T> {
|
||||||
|
|
||||||
private void internalPrepend(T listener) {
|
private void internalPrepend(T listener) {
|
||||||
checkAgainstBaseInterface( listener );
|
checkAgainstBaseInterface( listener );
|
||||||
|
performInjections( listener );
|
||||||
listeners.add( 0, listener );
|
listeners.add( 0, listener );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void performInjections(T listener) {
|
||||||
|
if ( CallbackRegistryConsumer.class.isInstance( listener ) ) {
|
||||||
|
( (CallbackRegistryConsumer) listener ).injectCallbackRegistry( listenerRegistry.getCallbackRegistry() );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( JpaBootstrapSensitive.class.isInstance( listener ) ) {
|
||||||
|
( (JpaBootstrapSensitive) listener ).wasJpaBootstrap(
|
||||||
|
listenerRegistry.getSessionFactory().getSessionFactoryOptions().isJpaBootstrap()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void checkAgainstBaseInterface(T listener) {
|
private void checkAgainstBaseInterface(T listener) {
|
||||||
if ( !eventType.baseListenerInterface().isInstance( listener ) ) {
|
if ( !eventType.baseListenerInterface().isInstance( listener ) ) {
|
||||||
throw new EventListenerRegistrationException(
|
throw new EventListenerRegistrationException(
|
||||||
|
@ -156,6 +176,7 @@ public class EventListenerGroupImpl<T> implements EventListenerGroup<T> {
|
||||||
|
|
||||||
private void internalAppend(T listener) {
|
private void internalAppend(T listener) {
|
||||||
checkAgainstBaseInterface( listener );
|
checkAgainstBaseInterface( listener );
|
||||||
|
performInjections( listener );
|
||||||
listeners.add( listener );
|
listeners.add( listener );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,9 @@ import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.hibernate.HibernateException;
|
import org.hibernate.HibernateException;
|
||||||
|
import org.hibernate.boot.spi.BootstrapContext;
|
||||||
|
import org.hibernate.boot.spi.MetadataImplementor;
|
||||||
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
import org.hibernate.event.internal.DefaultAutoFlushEventListener;
|
import org.hibernate.event.internal.DefaultAutoFlushEventListener;
|
||||||
import org.hibernate.event.internal.DefaultDeleteEventListener;
|
import org.hibernate.event.internal.DefaultDeleteEventListener;
|
||||||
import org.hibernate.event.internal.DefaultDirtyCheckEventListener;
|
import org.hibernate.event.internal.DefaultDirtyCheckEventListener;
|
||||||
|
@ -31,10 +34,19 @@ import org.hibernate.event.internal.DefaultResolveNaturalIdEventListener;
|
||||||
import org.hibernate.event.internal.DefaultSaveEventListener;
|
import org.hibernate.event.internal.DefaultSaveEventListener;
|
||||||
import org.hibernate.event.internal.DefaultSaveOrUpdateEventListener;
|
import org.hibernate.event.internal.DefaultSaveOrUpdateEventListener;
|
||||||
import org.hibernate.event.internal.DefaultUpdateEventListener;
|
import org.hibernate.event.internal.DefaultUpdateEventListener;
|
||||||
|
import org.hibernate.event.internal.PostDeleteEventListenerStandardImpl;
|
||||||
|
import org.hibernate.event.internal.PostInsertEventListenerStandardImpl;
|
||||||
|
import org.hibernate.event.internal.PostUpdateEventListenerStandardImpl;
|
||||||
import org.hibernate.event.service.spi.DuplicationStrategy;
|
import org.hibernate.event.service.spi.DuplicationStrategy;
|
||||||
import org.hibernate.event.service.spi.EventListenerRegistrationException;
|
import org.hibernate.event.service.spi.EventListenerRegistrationException;
|
||||||
import org.hibernate.event.service.spi.EventListenerRegistry;
|
import org.hibernate.event.service.spi.EventListenerRegistry;
|
||||||
import org.hibernate.event.spi.EventType;
|
import org.hibernate.event.spi.EventType;
|
||||||
|
import org.hibernate.jpa.event.internal.CallbackBuilderLegacyImpl;
|
||||||
|
import org.hibernate.jpa.event.internal.CallbackRegistryImpl;
|
||||||
|
import org.hibernate.jpa.event.spi.CallbackBuilder;
|
||||||
|
import org.hibernate.mapping.PersistentClass;
|
||||||
|
import org.hibernate.resource.beans.spi.ManagedBeanRegistry;
|
||||||
|
import org.hibernate.service.spi.Stoppable;
|
||||||
|
|
||||||
import static org.hibernate.event.spi.EventType.AUTO_FLUSH;
|
import static org.hibernate.event.spi.EventType.AUTO_FLUSH;
|
||||||
import static org.hibernate.event.spi.EventType.CLEAR;
|
import static org.hibernate.event.spi.EventType.CLEAR;
|
||||||
|
@ -76,10 +88,44 @@ import static org.hibernate.event.spi.EventType.UPDATE;
|
||||||
/**
|
/**
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public class EventListenerRegistryImpl implements EventListenerRegistry {
|
public class EventListenerRegistryImpl implements EventListenerRegistry, Stoppable {
|
||||||
private Map<Class,Object> listenerClassToInstanceMap = new HashMap<Class, Object>();
|
private Map<Class,Object> listenerClassToInstanceMap = new HashMap<>();
|
||||||
|
|
||||||
private EventListenerGroupImpl[] registeredEventListeners = prepareListenerAssociation();
|
private final SessionFactoryImplementor sessionFactory;
|
||||||
|
private CallbackBuilder callbackBuilder;
|
||||||
|
private CallbackRegistryImpl callbackRegistry;
|
||||||
|
private EventListenerGroupImpl[] registeredEventListeners;
|
||||||
|
|
||||||
|
EventListenerRegistryImpl(BootstrapContext bootstrapContext, SessionFactoryImplementor sessionFactory) {
|
||||||
|
this.sessionFactory = sessionFactory;
|
||||||
|
|
||||||
|
this.callbackRegistry = new CallbackRegistryImpl();
|
||||||
|
this.callbackBuilder = new CallbackBuilderLegacyImpl(
|
||||||
|
bootstrapContext.getServiceRegistry().getService( ManagedBeanRegistry.class ),
|
||||||
|
bootstrapContext.getReflectionManager()
|
||||||
|
);
|
||||||
|
|
||||||
|
this.registeredEventListeners = buildListenerGroups( bootstrapContext );
|
||||||
|
}
|
||||||
|
|
||||||
|
SessionFactoryImplementor getSessionFactory() {
|
||||||
|
return sessionFactory;
|
||||||
|
}
|
||||||
|
|
||||||
|
CallbackRegistryImpl getCallbackRegistry() {
|
||||||
|
return callbackRegistry;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void prepare(MetadataImplementor metadata) {
|
||||||
|
for ( PersistentClass persistentClass : metadata.getEntityBindings() ) {
|
||||||
|
if ( persistentClass.getClassName() == null ) {
|
||||||
|
// we can have non java class persisted by hibernate
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
callbackBuilder.buildCallbacksForEntity( persistentClass.getClassName(), callbackRegistry );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressWarnings({ "unchecked" })
|
@SuppressWarnings({ "unchecked" })
|
||||||
public <T> EventListenerGroupImpl<T> getEventListenerGroup(EventType<T> eventType) {
|
public <T> EventListenerGroupImpl<T> getEventListenerGroup(EventType<T> eventType) {
|
||||||
|
@ -100,7 +146,8 @@ public class EventListenerRegistryImpl implements EventListenerRegistry {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <T> void setListeners(EventType<T> type, Class<? extends T>... listenerClasses) {
|
@SafeVarargs
|
||||||
|
public final <T> void setListeners(EventType<T> type, Class<? extends T>... listenerClasses) {
|
||||||
setListeners( type, resolveListenerInstances( type, listenerClasses ) );
|
setListeners( type, resolveListenerInstances( type, listenerClasses ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -136,37 +183,42 @@ public class EventListenerRegistryImpl implements EventListenerRegistry {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <T> void setListeners(EventType<T> type, T... listeners) {
|
@SafeVarargs
|
||||||
|
public final <T> void setListeners(EventType<T> type, T... listeners) {
|
||||||
EventListenerGroupImpl<T> registeredListeners = getEventListenerGroup( type );
|
EventListenerGroupImpl<T> registeredListeners = getEventListenerGroup( type );
|
||||||
registeredListeners.clear();
|
registeredListeners.clear();
|
||||||
if ( listeners != null ) {
|
if ( listeners != null ) {
|
||||||
for ( int i = 0, max = listeners.length; i < max; i++ ) {
|
for ( T listener : listeners ) {
|
||||||
registeredListeners.appendListener( listeners[i] );
|
registeredListeners.appendListener( listener );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <T> void appendListeners(EventType<T> type, Class<? extends T>... listenerClasses) {
|
@SafeVarargs
|
||||||
|
public final <T> void appendListeners(EventType<T> type, Class<? extends T>... listenerClasses) {
|
||||||
appendListeners( type, resolveListenerInstances( type, listenerClasses ) );
|
appendListeners( type, resolveListenerInstances( type, listenerClasses ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <T> void appendListeners(EventType<T> type, T... listeners) {
|
@SafeVarargs
|
||||||
|
public final <T> void appendListeners(EventType<T> type, T... listeners) {
|
||||||
getEventListenerGroup( type ).appendListeners( listeners );
|
getEventListenerGroup( type ).appendListeners( listeners );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <T> void prependListeners(EventType<T> type, Class<? extends T>... listenerClasses) {
|
@SafeVarargs
|
||||||
|
public final <T> void prependListeners(EventType<T> type, Class<? extends T>... listenerClasses) {
|
||||||
prependListeners( type, resolveListenerInstances( type, listenerClasses ) );
|
prependListeners( type, resolveListenerInstances( type, listenerClasses ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <T> void prependListeners(EventType<T> type, T... listeners) {
|
@SafeVarargs
|
||||||
|
public final <T> void prependListeners(EventType<T> type, T... listeners) {
|
||||||
getEventListenerGroup( type ).prependListeners( listeners );
|
getEventListenerGroup( type ).prependListeners( listeners );
|
||||||
}
|
}
|
||||||
|
|
||||||
private static EventListenerGroupImpl[] prepareListenerAssociation() {
|
private EventListenerGroupImpl[] buildListenerGroups(BootstrapContext bootstrapContext) {
|
||||||
EventListenerGroupImpl[] listenerArray = new EventListenerGroupImpl[ EventType.values().size() ];
|
EventListenerGroupImpl[] listenerArray = new EventListenerGroupImpl[ EventType.values().size() ];
|
||||||
|
|
||||||
// auto-flush listeners
|
// auto-flush listeners
|
||||||
|
@ -347,12 +399,14 @@ public class EventListenerRegistryImpl implements EventListenerRegistry {
|
||||||
// post-delete listeners
|
// post-delete listeners
|
||||||
prepareListeners(
|
prepareListeners(
|
||||||
POST_DELETE,
|
POST_DELETE,
|
||||||
|
new PostDeleteEventListenerStandardImpl(),
|
||||||
listenerArray
|
listenerArray
|
||||||
);
|
);
|
||||||
|
|
||||||
// post-insert listeners
|
// post-insert listeners
|
||||||
prepareListeners(
|
prepareListeners(
|
||||||
POST_INSERT,
|
POST_INSERT,
|
||||||
|
new PostInsertEventListenerStandardImpl(),
|
||||||
listenerArray
|
listenerArray
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -366,6 +420,7 @@ public class EventListenerRegistryImpl implements EventListenerRegistry {
|
||||||
// post-update listeners
|
// post-update listeners
|
||||||
prepareListeners(
|
prepareListeners(
|
||||||
POST_UPDATE,
|
POST_UPDATE,
|
||||||
|
new PostUpdateEventListenerStandardImpl(),
|
||||||
listenerArray
|
listenerArray
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -407,19 +462,19 @@ public class EventListenerRegistryImpl implements EventListenerRegistry {
|
||||||
return listenerArray;
|
return listenerArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static <T> void prepareListeners(EventType<T> type, EventListenerGroupImpl[] listenerArray) {
|
private <T> void prepareListeners(EventType<T> type, EventListenerGroupImpl[] listenerArray) {
|
||||||
prepareListeners( type, null, listenerArray );
|
prepareListeners( type, null, listenerArray );
|
||||||
}
|
}
|
||||||
|
|
||||||
private static <T> void prepareListeners(EventType<T> type, T defaultListener, EventListenerGroupImpl[] listenerArray) {
|
private <T> void prepareListeners(EventType<T> type, T defaultListener, EventListenerGroupImpl[] listenerArray) {
|
||||||
final EventListenerGroupImpl<T> listenerGroup;
|
final EventListenerGroupImpl<T> listenerGroup;
|
||||||
if ( type == EventType.POST_COMMIT_DELETE
|
if ( type == EventType.POST_COMMIT_DELETE
|
||||||
|| type == EventType.POST_COMMIT_INSERT
|
|| type == EventType.POST_COMMIT_INSERT
|
||||||
|| type == EventType.POST_COMMIT_UPDATE ) {
|
|| type == EventType.POST_COMMIT_UPDATE ) {
|
||||||
listenerGroup = new PostCommitEventListenerGroupImpl<T>( type );
|
listenerGroup = new PostCommitEventListenerGroupImpl<T>( type, this );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
listenerGroup = new EventListenerGroupImpl<T>( type );
|
listenerGroup = new EventListenerGroupImpl<T>( type, this );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( defaultListener != null ) {
|
if ( defaultListener != null ) {
|
||||||
|
@ -428,4 +483,13 @@ public class EventListenerRegistryImpl implements EventListenerRegistry {
|
||||||
listenerArray[ type.ordinal() ] = listenerGroup;
|
listenerArray[ type.ordinal() ] = listenerGroup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void stop() {
|
||||||
|
if ( callbackRegistry != null ) {
|
||||||
|
callbackRegistry.release();
|
||||||
|
}
|
||||||
|
if ( callbackBuilder != null ) {
|
||||||
|
callbackBuilder.release();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,6 @@ public class EventListenerServiceInitiator implements SessionFactoryServiceIniti
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public EventListenerRegistry initiateService(SessionFactoryServiceInitiatorContext context) {
|
public EventListenerRegistry initiateService(SessionFactoryServiceInitiatorContext context) {
|
||||||
return new EventListenerRegistryImpl();
|
return new EventListenerRegistryImpl( context.getBootstrapContext(), context.getSessionFactory() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,13 +22,13 @@ import org.hibernate.internal.CoreMessageLogger;
|
||||||
*
|
*
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public class PostCommitEventListenerGroupImpl<T> extends EventListenerGroupImpl<T> {
|
class PostCommitEventListenerGroupImpl<T> extends EventListenerGroupImpl<T> {
|
||||||
private static final CoreMessageLogger log = CoreLogging.messageLogger( PostCommitEventListenerGroupImpl.class );
|
private static final CoreMessageLogger log = CoreLogging.messageLogger( PostCommitEventListenerGroupImpl.class );
|
||||||
|
|
||||||
private final Class extendedListenerContract;
|
private final Class extendedListenerContract;
|
||||||
|
|
||||||
public PostCommitEventListenerGroupImpl(EventType<T> eventType) {
|
public PostCommitEventListenerGroupImpl(EventType<T> eventType, EventListenerRegistryImpl listenerRegistry) {
|
||||||
super( eventType );
|
super( eventType, listenerRegistry );
|
||||||
|
|
||||||
if ( eventType == EventType.POST_COMMIT_DELETE ) {
|
if ( eventType == EventType.POST_COMMIT_DELETE ) {
|
||||||
this.extendedListenerContract = PostCommitDeleteEventListener.class;
|
this.extendedListenerContract = PostCommitDeleteEventListener.class;
|
||||||
|
|
|
@ -8,6 +8,7 @@ package org.hibernate.event.service.spi;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
import org.hibernate.boot.spi.MetadataImplementor;
|
||||||
import org.hibernate.event.spi.EventType;
|
import org.hibernate.event.spi.EventType;
|
||||||
import org.hibernate.service.Service;
|
import org.hibernate.service.Service;
|
||||||
|
|
||||||
|
@ -18,16 +19,18 @@ import org.hibernate.service.Service;
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public interface EventListenerRegistry extends Service, Serializable {
|
public interface EventListenerRegistry extends Service, Serializable {
|
||||||
public <T> EventListenerGroup<T> getEventListenerGroup(EventType<T> eventType);
|
void prepare(MetadataImplementor metadata);
|
||||||
|
|
||||||
public void addDuplicationStrategy(DuplicationStrategy strategy);
|
<T> EventListenerGroup<T> getEventListenerGroup(EventType<T> eventType);
|
||||||
|
|
||||||
public <T> void setListeners(EventType<T> type, Class<? extends T>... listeners);
|
void addDuplicationStrategy(DuplicationStrategy strategy);
|
||||||
public <T> void setListeners(EventType<T> type, T... listeners);
|
|
||||||
|
|
||||||
public <T> void appendListeners(EventType<T> type, Class<? extends T>... listeners);
|
<T> void setListeners(EventType<T> type, Class<? extends T>... listeners);
|
||||||
public <T> void appendListeners(EventType<T> type, T... listeners);
|
<T> void setListeners(EventType<T> type, T... listeners);
|
||||||
|
|
||||||
public <T> void prependListeners(EventType<T> type, Class<? extends T>... listeners);
|
<T> void appendListeners(EventType<T> type, Class<? extends T>... listeners);
|
||||||
public <T> void prependListeners(EventType<T> type, T... listeners);
|
<T> void appendListeners(EventType<T> type, T... listeners);
|
||||||
|
|
||||||
|
<T> void prependListeners(EventType<T> type, Class<? extends T>... listeners);
|
||||||
|
<T> void prependListeners(EventType<T> type, T... listeners);
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,12 +4,13 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* 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>.
|
* 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;
|
package org.hibernate.event.service.spi;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Marker interface for handling listener duplication checking (to avoid multiple registrations).
|
* Defines an event listener that is sensitive to whether a native or jpa bootstrap was performed
|
||||||
*
|
*
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public interface HibernateEntityManagerEventListener {
|
public interface JpaBootstrapSensitive {
|
||||||
|
void wasJpaBootstrap(boolean wasJpaBootstrap);
|
||||||
}
|
}
|
|
@ -207,6 +207,8 @@ public final class SessionFactoryImpl implements SessionFactoryImplementor {
|
||||||
.getService( SessionFactoryServiceRegistryFactory.class )
|
.getService( SessionFactoryServiceRegistryFactory.class )
|
||||||
.buildServiceRegistry( this, bootstrapContext, options );
|
.buildServiceRegistry( this, bootstrapContext, options );
|
||||||
|
|
||||||
|
prepareEventListeners( metadata );
|
||||||
|
|
||||||
final CfgXmlAccessService cfgXmlAccessService = serviceRegistry.getService( CfgXmlAccessService.class );
|
final CfgXmlAccessService cfgXmlAccessService = serviceRegistry.getService( CfgXmlAccessService.class );
|
||||||
|
|
||||||
String sfName = settings.getSessionFactoryName();
|
String sfName = settings.getSessionFactoryName();
|
||||||
|
@ -388,6 +390,40 @@ public final class SessionFactoryImpl implements SessionFactoryImplementor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void prepareEventListeners(MetadataImplementor metadata) {
|
||||||
|
final EventListenerRegistry eventListenerRegistry = serviceRegistry.getService( EventListenerRegistry.class );
|
||||||
|
final ConfigurationService cfgService = serviceRegistry.getService( ConfigurationService.class );
|
||||||
|
final ClassLoaderService classLoaderService = serviceRegistry.getService( ClassLoaderService.class );
|
||||||
|
|
||||||
|
eventListenerRegistry.prepare( metadata );
|
||||||
|
|
||||||
|
for ( Map.Entry entry : ( (Map<?, ?>) cfgService.getSettings() ).entrySet() ) {
|
||||||
|
if ( !String.class.isInstance( entry.getKey() ) ) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
final String propertyName = (String) entry.getKey();
|
||||||
|
if ( !propertyName.startsWith( org.hibernate.jpa.AvailableSettings.EVENT_LISTENER_PREFIX ) ) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
final String eventTypeName = propertyName.substring( org.hibernate.jpa.AvailableSettings.EVENT_LISTENER_PREFIX
|
||||||
|
.length() + 1 );
|
||||||
|
final EventType eventType = EventType.resolveEventTypeByName( eventTypeName );
|
||||||
|
final EventListenerGroup eventListenerGroup = eventListenerRegistry.getEventListenerGroup( eventType );
|
||||||
|
for ( String listenerImpl : ( (String) entry.getValue() ).split( " ," ) ) {
|
||||||
|
eventListenerGroup.appendListener( instantiate( listenerImpl, classLoaderService ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Object instantiate(String listenerImpl, ClassLoaderService classLoaderService) {
|
||||||
|
try {
|
||||||
|
return classLoaderService.classForName( listenerImpl ).newInstance();
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
throw new HibernateException( "Could not instantiate requested listener [" + listenerImpl + "]", e );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void applyCfgXmlValues(LoadedConfig aggregatedConfig, SessionFactoryServiceRegistry serviceRegistry) {
|
private void applyCfgXmlValues(LoadedConfig aggregatedConfig, SessionFactoryServiceRegistry serviceRegistry) {
|
||||||
final JaccService jaccService = serviceRegistry.getService( JaccService.class );
|
final JaccService jaccService = serviceRegistry.getService( JaccService.class );
|
||||||
if ( jaccService.getContextId() != null ) {
|
if ( jaccService.getContextId() != null ) {
|
||||||
|
|
|
@ -36,7 +36,6 @@ import org.hibernate.boot.cfgxml.internal.ConfigLoader;
|
||||||
import org.hibernate.boot.cfgxml.spi.CfgXmlAccessService;
|
import org.hibernate.boot.cfgxml.spi.CfgXmlAccessService;
|
||||||
import org.hibernate.boot.cfgxml.spi.LoadedConfig;
|
import org.hibernate.boot.cfgxml.spi.LoadedConfig;
|
||||||
import org.hibernate.boot.cfgxml.spi.MappingReference;
|
import org.hibernate.boot.cfgxml.spi.MappingReference;
|
||||||
import org.hibernate.boot.model.TypeContributor;
|
|
||||||
import org.hibernate.boot.model.process.spi.ManagedResources;
|
import org.hibernate.boot.model.process.spi.ManagedResources;
|
||||||
import org.hibernate.boot.model.process.spi.MetadataBuildingProcess;
|
import org.hibernate.boot.model.process.spi.MetadataBuildingProcess;
|
||||||
import org.hibernate.boot.registry.BootstrapServiceRegistry;
|
import org.hibernate.boot.registry.BootstrapServiceRegistry;
|
||||||
|
@ -68,7 +67,6 @@ import org.hibernate.jpa.boot.spi.IntegratorProvider;
|
||||||
import org.hibernate.jpa.boot.spi.PersistenceUnitDescriptor;
|
import org.hibernate.jpa.boot.spi.PersistenceUnitDescriptor;
|
||||||
import org.hibernate.jpa.boot.spi.StrategyRegistrationProviderList;
|
import org.hibernate.jpa.boot.spi.StrategyRegistrationProviderList;
|
||||||
import org.hibernate.jpa.boot.spi.TypeContributorList;
|
import org.hibernate.jpa.boot.spi.TypeContributorList;
|
||||||
import org.hibernate.jpa.event.spi.JpaIntegrator;
|
|
||||||
import org.hibernate.jpa.internal.util.LogHelper;
|
import org.hibernate.jpa.internal.util.LogHelper;
|
||||||
import org.hibernate.jpa.internal.util.PersistenceUnitTransactionTypeHelper;
|
import org.hibernate.jpa.internal.util.PersistenceUnitTransactionTypeHelper;
|
||||||
import org.hibernate.jpa.spi.IdentifierGeneratorStrategyProvider;
|
import org.hibernate.jpa.spi.IdentifierGeneratorStrategyProvider;
|
||||||
|
@ -334,8 +332,6 @@ public class EntityManagerFactoryBuilderImpl implements EntityManagerFactoryBuil
|
||||||
ClassLoaderService providedClassLoaderService) {
|
ClassLoaderService providedClassLoaderService) {
|
||||||
final BootstrapServiceRegistryBuilder bsrBuilder = new BootstrapServiceRegistryBuilder();
|
final BootstrapServiceRegistryBuilder bsrBuilder = new BootstrapServiceRegistryBuilder();
|
||||||
|
|
||||||
bsrBuilder.applyIntegrator( new JpaIntegrator() );
|
|
||||||
|
|
||||||
final IntegratorProvider integratorProvider = (IntegratorProvider) integrationSettings.get( INTEGRATOR_PROVIDER );
|
final IntegratorProvider integratorProvider = (IntegratorProvider) integrationSettings.get( INTEGRATOR_PROVIDER );
|
||||||
if ( integratorProvider != null ) {
|
if ( integratorProvider != null ) {
|
||||||
for ( Integrator integrator : integratorProvider.getIntegrators() ) {
|
for ( Integrator integrator : integratorProvider.getIntegrators() ) {
|
||||||
|
@ -772,9 +768,7 @@ public class EntityManagerFactoryBuilderImpl implements EntityManagerFactoryBuil
|
||||||
// add any explicit orm.xml references passed in
|
// add any explicit orm.xml references passed in
|
||||||
final List<String> explicitOrmXmlList = (List<String>) configurationValues.remove( AvailableSettings.XML_FILE_NAMES );
|
final List<String> explicitOrmXmlList = (List<String>) configurationValues.remove( AvailableSettings.XML_FILE_NAMES );
|
||||||
if ( explicitOrmXmlList != null ) {
|
if ( explicitOrmXmlList != null ) {
|
||||||
for ( String ormXml : explicitOrmXmlList ) {
|
explicitOrmXmlList.forEach( metadataSources::addResource );
|
||||||
metadataSources.addResource( ormXml );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return attributeConverterDefinitions;
|
return attributeConverterDefinitions;
|
||||||
|
@ -800,24 +794,18 @@ public class EntityManagerFactoryBuilderImpl implements EntityManagerFactoryBuil
|
||||||
);
|
);
|
||||||
|
|
||||||
if ( mergedSettings.cacheRegionDefinitions != null ) {
|
if ( mergedSettings.cacheRegionDefinitions != null ) {
|
||||||
for ( CacheRegionDefinition localCacheRegionDefinition : mergedSettings.cacheRegionDefinitions ) {
|
mergedSettings.cacheRegionDefinitions.forEach( metamodelBuilder::applyCacheRegionDefinition );
|
||||||
metamodelBuilder.applyCacheRegionDefinition( localCacheRegionDefinition );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final TypeContributorList typeContributorList = (TypeContributorList) configurationValues.remove(
|
final TypeContributorList typeContributorList = (TypeContributorList) configurationValues.remove(
|
||||||
TYPE_CONTRIBUTORS
|
TYPE_CONTRIBUTORS
|
||||||
);
|
);
|
||||||
if ( typeContributorList != null ) {
|
if ( typeContributorList != null ) {
|
||||||
for ( TypeContributor typeContributor : typeContributorList.getTypeContributors() ) {
|
typeContributorList.getTypeContributors().forEach( metamodelBuilder::applyTypes );
|
||||||
metamodelBuilder.applyTypes( typeContributor );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( attributeConverterDefinitions != null ) {
|
if ( attributeConverterDefinitions != null ) {
|
||||||
for ( AttributeConverterDefinition attributeConverterDefinition : attributeConverterDefinitions ) {
|
attributeConverterDefinitions.forEach( metamodelBuilder::applyAttributeConverter );
|
||||||
metamodelBuilder.applyAttributeConverter( attributeConverterDefinition );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -903,7 +891,6 @@ public class EntityManagerFactoryBuilderImpl implements EntityManagerFactoryBuil
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void populate(SessionFactoryBuilder sfBuilder, StandardServiceRegistry ssr) {
|
protected void populate(SessionFactoryBuilder sfBuilder, StandardServiceRegistry ssr) {
|
||||||
metamodelBuilder.getBootstrapContext().markAsJpaBootstrap();
|
|
||||||
|
|
||||||
final StrategySelector strategySelector = ssr.getService( StrategySelector.class );
|
final StrategySelector strategySelector = ssr.getService( StrategySelector.class );
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,10 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
* 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
|
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.event.spi;
|
package org.hibernate.jpa.event.internal;
|
||||||
|
|
||||||
|
import org.hibernate.jpa.event.spi.Callback;
|
||||||
|
import org.hibernate.jpa.event.spi.CallbackType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Abstract support for Callback implementations
|
* Abstract support for Callback implementations
|
|
@ -76,6 +76,11 @@ public class CallbackBuilderLegacyImpl implements CallbackBuilder {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void release() {
|
||||||
|
// nothing to do
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressWarnings({"unchecked", "WeakerAccess"})
|
@SuppressWarnings({"unchecked", "WeakerAccess"})
|
||||||
public Callback[] resolveCallbacks(XClass beanClass, CallbackType callbackType, ReflectionManager reflectionManager) {
|
public Callback[] resolveCallbacks(XClass beanClass, CallbackType callbackType, ReflectionManager reflectionManager) {
|
||||||
List<Callback> callbacks = new ArrayList<>();
|
List<Callback> callbacks = new ArrayList<>();
|
||||||
|
|
|
@ -9,7 +9,6 @@ package org.hibernate.jpa.event.internal;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
import org.hibernate.jpa.event.spi.AbstractCallback;
|
|
||||||
import org.hibernate.jpa.event.spi.CallbackType;
|
import org.hibernate.jpa.event.spi.CallbackType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -9,7 +9,6 @@ package org.hibernate.jpa.event.internal;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
import org.hibernate.jpa.event.spi.AbstractCallback;
|
|
||||||
import org.hibernate.jpa.event.spi.CallbackType;
|
import org.hibernate.jpa.event.spi.CallbackType;
|
||||||
import org.hibernate.resource.beans.spi.ManagedBean;
|
import org.hibernate.resource.beans.spi.ManagedBean;
|
||||||
|
|
||||||
|
|
|
@ -1,38 +0,0 @@
|
||||||
/*
|
|
||||||
* 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 java.util.IdentityHashMap;
|
|
||||||
|
|
||||||
import org.hibernate.engine.spi.CascadingAction;
|
|
||||||
import org.hibernate.engine.spi.CascadingActions;
|
|
||||||
import org.hibernate.event.internal.DefaultAutoFlushEventListener;
|
|
||||||
import org.hibernate.event.spi.AutoFlushEventListener;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* In JPA, it is the create operation that is cascaded to unmanaged entities at flush time (instead of the save-update
|
|
||||||
* operation in Hibernate).
|
|
||||||
*
|
|
||||||
* @author Gavin King
|
|
||||||
*/
|
|
||||||
public class JpaAutoFlushEventListener
|
|
||||||
extends DefaultAutoFlushEventListener
|
|
||||||
implements HibernateEntityManagerEventListener {
|
|
||||||
|
|
||||||
public static final AutoFlushEventListener INSTANCE = new JpaAutoFlushEventListener();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected CascadingAction getCascadingAction() {
|
|
||||||
return CascadingActions.PERSIST_ON_FLUSH;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Object getAnything() {
|
|
||||||
return new IdentityHashMap( 10 );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,54 +0,0 @@
|
||||||
/*
|
|
||||||
* 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 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.event.spi.CallbackRegistryConsumer;
|
|
||||||
import org.hibernate.jpa.event.spi.CallbackRegistry;
|
|
||||||
import org.hibernate.persister.entity.EntityPersister;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Overrides the LifeCycle OnSave call to call the PreRemove operation
|
|
||||||
*
|
|
||||||
* @author Emmanuel Bernard
|
|
||||||
*/
|
|
||||||
public class JpaDeleteEventListener extends DefaultDeleteEventListener implements CallbackRegistryConsumer {
|
|
||||||
private CallbackRegistry callbackRegistry;
|
|
||||||
|
|
||||||
public void injectCallbackRegistry(CallbackRegistry callbackRegistry) {
|
|
||||||
this.callbackRegistry = callbackRegistry;
|
|
||||||
}
|
|
||||||
|
|
||||||
public JpaDeleteEventListener() {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
public JpaDeleteEventListener(CallbackRegistry callbackRegistry) {
|
|
||||||
this();
|
|
||||||
this.callbackRegistry = callbackRegistry;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean invokeDeleteLifecycle(EventSource session, Object entity, EntityPersister persister) {
|
|
||||||
callbackRegistry.preRemove( entity );
|
|
||||||
return super.invokeDeleteLifecycle( session, entity, persister );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void performDetachedEntityDeletionCheck(DeleteEvent event) {
|
|
||||||
EventSource source = event.getSession();
|
|
||||||
String entityName = event.getEntityName();
|
|
||||||
EntityPersister persister = source.getEntityPersister( entityName, event.getObject() );
|
|
||||||
Serializable id = persister.getIdentifier( event.getObject(), source );
|
|
||||||
entityName = entityName == null ? source.guessEntityName( event.getObject() ) : entityName;
|
|
||||||
throw new IllegalArgumentException("Removing a detached instance "+ entityName + "#" + id);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,74 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.SessionFactory;
|
|
||||||
import org.hibernate.bytecode.enhance.spi.LazyPropertyInitializer;
|
|
||||||
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.event.spi.CallbackRegistryConsumer;
|
|
||||||
import org.hibernate.jpa.event.spi.CallbackRegistry;
|
|
||||||
import org.hibernate.metadata.ClassMetadata;
|
|
||||||
import org.hibernate.persister.entity.EntityPersister;
|
|
||||||
import org.hibernate.type.Type;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Overrides the LifeCycle OnSave call to call the PreUpdate operation
|
|
||||||
*
|
|
||||||
* @author Emmanuel Bernard
|
|
||||||
*/
|
|
||||||
public class JpaFlushEntityEventListener extends DefaultFlushEntityEventListener implements CallbackRegistryConsumer {
|
|
||||||
private CallbackRegistry callbackRegistry;
|
|
||||||
|
|
||||||
public void injectCallbackRegistry(CallbackRegistry callbackRegistry) {
|
|
||||||
this.callbackRegistry = callbackRegistry;
|
|
||||||
}
|
|
||||||
|
|
||||||
public JpaFlushEntityEventListener() {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
public JpaFlushEntityEventListener(CallbackRegistry callbackRegistry) {
|
|
||||||
super();
|
|
||||||
this.callbackRegistry = callbackRegistry;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean invokeInterceptor(
|
|
||||||
SessionImplementor session,
|
|
||||||
Object entity,
|
|
||||||
EntityEntry entry,
|
|
||||||
Object[] values,
|
|
||||||
EntityPersister persister) {
|
|
||||||
boolean isDirty = false;
|
|
||||||
if ( entry.getStatus() != Status.DELETED ) {
|
|
||||||
if ( callbackRegistry.preUpdate( entity ) ) {
|
|
||||||
isDirty = copyState( entity, persister.getPropertyTypes(), values, session.getFactory() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return super.invokeInterceptor( session, entity, entry, values, persister ) || isDirty;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean copyState(Object entity, Type[] types, Object[] state, SessionFactory sf) {
|
|
||||||
// copy the entity state into the state array and return true if the state has changed
|
|
||||||
ClassMetadata metadata = sf.getClassMetadata( entity.getClass() );
|
|
||||||
Object[] newState = metadata.getPropertyValues( entity );
|
|
||||||
int size = newState.length;
|
|
||||||
boolean isDirty = false;
|
|
||||||
for ( int index = 0; index < size ; index++ ) {
|
|
||||||
if ( ( state[index] == LazyPropertyInitializer.UNFETCHED_PROPERTY &&
|
|
||||||
newState[index] != LazyPropertyInitializer.UNFETCHED_PROPERTY ) ||
|
|
||||||
( state[index] != newState[index] && !types[index].isEqual( state[index], newState[index] ) ) ) {
|
|
||||||
isDirty = true;
|
|
||||||
state[index] = newState[index];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return isDirty;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,35 +0,0 @@
|
||||||
/*
|
|
||||||
* 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 java.util.IdentityHashMap;
|
|
||||||
|
|
||||||
import org.hibernate.engine.spi.CascadingAction;
|
|
||||||
import org.hibernate.engine.spi.CascadingActions;
|
|
||||||
import org.hibernate.event.internal.DefaultFlushEventListener;
|
|
||||||
import org.hibernate.event.spi.FlushEventListener;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* In JPA, it is the create operation that is cascaded to unmanaged entities at flush time (instead of the
|
|
||||||
* save-update operation in Hibernate).
|
|
||||||
*
|
|
||||||
* @author Gavin King
|
|
||||||
*/
|
|
||||||
public class JpaFlushEventListener extends DefaultFlushEventListener implements HibernateEntityManagerEventListener {
|
|
||||||
public static final FlushEventListener INSTANCE = new JpaFlushEventListener();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected CascadingAction getCascadingAction() {
|
|
||||||
return CascadingActions.PERSIST_ON_FLUSH;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Object getAnything() {
|
|
||||||
return new IdentityHashMap( 10 );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,58 +0,0 @@
|
||||||
/*
|
|
||||||
* 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 java.io.Serializable;
|
|
||||||
|
|
||||||
import org.hibernate.event.internal.DefaultMergeEventListener;
|
|
||||||
import org.hibernate.event.spi.EventSource;
|
|
||||||
import org.hibernate.jpa.event.spi.CallbackRegistryConsumer;
|
|
||||||
import org.hibernate.jpa.event.spi.CallbackRegistry;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Overrides the LifeCycle OnSave call to call the PrePersist operation
|
|
||||||
*
|
|
||||||
* @author Emmanuel Bernard
|
|
||||||
*/
|
|
||||||
public class JpaMergeEventListener extends DefaultMergeEventListener implements CallbackRegistryConsumer {
|
|
||||||
private CallbackRegistry callbackRegistry;
|
|
||||||
|
|
||||||
public void injectCallbackRegistry(CallbackRegistry callbackRegistry) {
|
|
||||||
this.callbackRegistry = callbackRegistry;
|
|
||||||
}
|
|
||||||
|
|
||||||
public JpaMergeEventListener() {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
public JpaMergeEventListener(CallbackRegistry callbackRegistry) {
|
|
||||||
super();
|
|
||||||
this.callbackRegistry = callbackRegistry;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Serializable saveWithRequestedId(
|
|
||||||
Object entity,
|
|
||||||
Serializable requestedId,
|
|
||||||
String entityName,
|
|
||||||
Object anything,
|
|
||||||
EventSource source) {
|
|
||||||
callbackRegistry.preCreate( entity );
|
|
||||||
return super.saveWithRequestedId( entity, requestedId, entityName, anything, source );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Serializable saveWithGeneratedId(
|
|
||||||
Object entity,
|
|
||||||
String entityName,
|
|
||||||
Object anything,
|
|
||||||
EventSource source,
|
|
||||||
boolean requiresImmediateIdAccess) {
|
|
||||||
callbackRegistry.preCreate( entity );
|
|
||||||
return super.saveWithGeneratedId( entity, entityName, anything, source, requiresImmediateIdAccess );
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,100 +0,0 @@
|
||||||
/*
|
|
||||||
* 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 java.io.Serializable;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.hibernate.HibernateException;
|
|
||||||
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.event.spi.CallbackRegistryConsumer;
|
|
||||||
import org.hibernate.jpa.event.spi.CallbackRegistry;
|
|
||||||
import org.hibernate.type.CollectionType;
|
|
||||||
|
|
||||||
import org.jboss.logging.Logger;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Overrides the LifeCycle OnSave call to call the PrePersist operation
|
|
||||||
*
|
|
||||||
* @author Emmanuel Bernard
|
|
||||||
*/
|
|
||||||
public class JpaPersistEventListener extends DefaultPersistEventListener implements CallbackRegistryConsumer {
|
|
||||||
private static final Logger log = Logger.getLogger( JpaPersistEventListener.class );
|
|
||||||
|
|
||||||
private CallbackRegistry callbackRegistry;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void injectCallbackRegistry(CallbackRegistry callbackRegistry) {
|
|
||||||
this.callbackRegistry = callbackRegistry;
|
|
||||||
}
|
|
||||||
|
|
||||||
public JpaPersistEventListener() {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
public JpaPersistEventListener(CallbackRegistry callbackRegistry) {
|
|
||||||
super();
|
|
||||||
this.callbackRegistry = callbackRegistry;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Serializable saveWithRequestedId(
|
|
||||||
Object entity,
|
|
||||||
Serializable requestedId,
|
|
||||||
String entityName,
|
|
||||||
Object anything,
|
|
||||||
EventSource source) {
|
|
||||||
callbackRegistry.preCreate( entity );
|
|
||||||
return super.saveWithRequestedId( entity, requestedId, entityName, anything, source );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Serializable saveWithGeneratedId(
|
|
||||||
Object entity,
|
|
||||||
String entityName,
|
|
||||||
Object anything,
|
|
||||||
EventSource source,
|
|
||||||
boolean requiresImmediateIdAccess) {
|
|
||||||
callbackRegistry.preCreate( entity );
|
|
||||||
return super.saveWithGeneratedId( entity, entityName, anything, source, requiresImmediateIdAccess );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected CascadingAction getCascadeAction() {
|
|
||||||
return PERSIST_SKIPLAZY;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static final CascadingAction PERSIST_SKIPLAZY = new CascadingActions.BaseCascadingAction() {
|
|
||||||
@Override
|
|
||||||
public void cascade(EventSource session, Object child, String entityName, Object anything, boolean isCascadeDeleteEnabled)
|
|
||||||
throws HibernateException {
|
|
||||||
log.trace( "Cascading persist to : " + entityName );
|
|
||||||
session.persist( entityName, child, (Map) anything );
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public Iterator getCascadableChildrenIterator(EventSource session, CollectionType collectionType, Object collection) {
|
|
||||||
// persists don't cascade to uninitialized collections
|
|
||||||
return CascadingActions.getLoadedElementsIterator( session, collectionType, collection );
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public boolean deleteOrphans() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public boolean performOnLazyProperty() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "ACTION_PERSIST_SKIPLAZY";
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
|
@ -1,20 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.CascadingAction;
|
|
||||||
import org.hibernate.engine.spi.CascadingActions;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Emmanuel Bernard
|
|
||||||
*/
|
|
||||||
public class JpaPersistOnFlushEventListener extends JpaPersistEventListener {
|
|
||||||
@Override
|
|
||||||
protected CascadingAction getCascadeAction() {
|
|
||||||
return CascadingActions.PERSIST_ON_FLUSH;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,39 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.event.spi.PostLoadEvent;
|
|
||||||
import org.hibernate.event.spi.PostLoadEventListener;
|
|
||||||
import org.hibernate.jpa.event.spi.CallbackRegistryConsumer;
|
|
||||||
import org.hibernate.jpa.event.spi.CallbackRegistry;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author <a href="mailto:kabir.khan@jboss.org">Kabir Khan</a>
|
|
||||||
*/
|
|
||||||
public class JpaPostLoadEventListener implements PostLoadEventListener, CallbackRegistryConsumer {
|
|
||||||
CallbackRegistry callbackRegistry;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void injectCallbackRegistry(CallbackRegistry callbackRegistry) {
|
|
||||||
this.callbackRegistry = callbackRegistry;
|
|
||||||
}
|
|
||||||
|
|
||||||
public JpaPostLoadEventListener() {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
public JpaPostLoadEventListener(CallbackRegistry callbackRegistry) {
|
|
||||||
this.callbackRegistry = callbackRegistry;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onPostLoad(PostLoadEvent event) {
|
|
||||||
Object entity = event.getEntity();
|
|
||||||
callbackRegistry.postLoad( entity );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,89 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.CallbackRegistryConsumer;
|
|
||||||
import org.hibernate.jpa.event.spi.CallbackRegistry;
|
|
||||||
import org.hibernate.jpa.event.spi.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);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,58 +0,0 @@
|
||||||
/*
|
|
||||||
* 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 java.io.Serializable;
|
|
||||||
|
|
||||||
import org.hibernate.event.internal.DefaultSaveEventListener;
|
|
||||||
import org.hibernate.event.spi.EventSource;
|
|
||||||
import org.hibernate.jpa.event.spi.CallbackRegistryConsumer;
|
|
||||||
import org.hibernate.jpa.event.spi.CallbackRegistry;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Overrides the LifeCycle OnSave call to call the PrePersist operation
|
|
||||||
*
|
|
||||||
* @author Emmanuel Bernard
|
|
||||||
*/
|
|
||||||
public class JpaSaveEventListener extends DefaultSaveEventListener implements CallbackRegistryConsumer {
|
|
||||||
private CallbackRegistry callbackRegistry;
|
|
||||||
|
|
||||||
public void injectCallbackRegistry(CallbackRegistry callbackRegistry) {
|
|
||||||
this.callbackRegistry = callbackRegistry;
|
|
||||||
}
|
|
||||||
|
|
||||||
public JpaSaveEventListener() {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
public JpaSaveEventListener(CallbackRegistry callbackRegistry) {
|
|
||||||
super();
|
|
||||||
this.callbackRegistry = callbackRegistry;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Serializable saveWithRequestedId(
|
|
||||||
Object entity,
|
|
||||||
Serializable requestedId,
|
|
||||||
String entityName,
|
|
||||||
Object anything,
|
|
||||||
EventSource source) {
|
|
||||||
callbackRegistry.preCreate( entity );
|
|
||||||
return super.saveWithRequestedId( entity, requestedId, entityName, anything, source );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Serializable saveWithGeneratedId(
|
|
||||||
Object entity,
|
|
||||||
String entityName,
|
|
||||||
Object anything,
|
|
||||||
EventSource source,
|
|
||||||
boolean requiresImmediateIdAccess) {
|
|
||||||
callbackRegistry.preCreate( entity );
|
|
||||||
return super.saveWithGeneratedId( entity, entityName, anything, source, requiresImmediateIdAccess );
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,58 +0,0 @@
|
||||||
/*
|
|
||||||
* 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 java.io.Serializable;
|
|
||||||
|
|
||||||
import org.hibernate.event.internal.DefaultSaveOrUpdateEventListener;
|
|
||||||
import org.hibernate.event.spi.EventSource;
|
|
||||||
import org.hibernate.jpa.event.spi.CallbackRegistryConsumer;
|
|
||||||
import org.hibernate.jpa.event.spi.CallbackRegistry;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Overrides the LifeCycle OnSave call to call the PrePersist operation
|
|
||||||
*
|
|
||||||
* @author Emmanuel Bernard
|
|
||||||
*/
|
|
||||||
public class JpaSaveOrUpdateEventListener extends DefaultSaveOrUpdateEventListener implements CallbackRegistryConsumer {
|
|
||||||
private CallbackRegistry callbackRegistry;
|
|
||||||
|
|
||||||
public void injectCallbackRegistry(CallbackRegistry callbackRegistry) {
|
|
||||||
this.callbackRegistry = callbackRegistry;
|
|
||||||
}
|
|
||||||
|
|
||||||
public JpaSaveOrUpdateEventListener() {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
public JpaSaveOrUpdateEventListener(CallbackRegistry callbackRegistry) {
|
|
||||||
super();
|
|
||||||
this.callbackRegistry = callbackRegistry;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Serializable saveWithRequestedId(
|
|
||||||
Object entity,
|
|
||||||
Serializable requestedId,
|
|
||||||
String entityName,
|
|
||||||
Object anything,
|
|
||||||
EventSource source) {
|
|
||||||
callbackRegistry.preCreate( entity );
|
|
||||||
return super.saveWithRequestedId( entity, requestedId, entityName, anything, source );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Serializable saveWithGeneratedId(
|
|
||||||
Object entity,
|
|
||||||
String entityName,
|
|
||||||
Object anything,
|
|
||||||
EventSource source,
|
|
||||||
boolean requiresImmediateIdAccess) {
|
|
||||||
callbackRegistry.preCreate( entity );
|
|
||||||
return super.saveWithGeneratedId( entity, entityName, anything, source, requiresImmediateIdAccess );
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,15 +0,0 @@
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Hibernate EntityManager specific implementations of Hibernate event listeners. Generally the listeners
|
|
||||||
* here either:<ul>
|
|
||||||
* <li>provide tweaks to internal processing to conform with JPA spec</li>
|
|
||||||
* <li>bridge to JPA event callbacks</li>
|
|
||||||
* </ul>
|
|
||||||
*/
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
/*
|
||||||
|
* 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>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internal details of implementing support for JPA callbacks
|
||||||
|
*/
|
||||||
|
package org.hibernate.jpa.event.internal;
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
/*
|
||||||
|
* 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>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Support for JPA lifecycle callbacks.
|
||||||
|
*/
|
||||||
|
package org.hibernate.jpa.event;
|
|
@ -27,4 +27,6 @@ public interface CallbackBuilder {
|
||||||
}
|
}
|
||||||
|
|
||||||
void buildCallbacksForEntity(String entityName, CallbackRegistrar callbackRegistrar);
|
void buildCallbacksForEntity(String entityName, CallbackRegistrar callbackRegistrar);
|
||||||
|
|
||||||
|
void release();
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,15 +6,13 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.event.spi;
|
package org.hibernate.jpa.event.spi;
|
||||||
|
|
||||||
import org.hibernate.jpa.event.internal.core.HibernateEntityManagerEventListener;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Contract for injecting the registry of Callbacks into event listeners.
|
* Contract for injecting the registry of Callbacks into event listeners.
|
||||||
*
|
*
|
||||||
* @author Emmanuel Bernard
|
* @author Emmanuel Bernard
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public interface CallbackRegistryConsumer extends HibernateEntityManagerEventListener {
|
public interface CallbackRegistryConsumer {
|
||||||
/**
|
/**
|
||||||
* Injection of the CallbackRegistry
|
* Injection of the CallbackRegistry
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,206 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.spi;
|
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.hibernate.HibernateException;
|
|
||||||
import org.hibernate.annotations.common.reflection.ReflectionManager;
|
|
||||||
import org.hibernate.boot.Metadata;
|
|
||||||
import org.hibernate.boot.internal.MetadataImpl;
|
|
||||||
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
|
|
||||||
import org.hibernate.boot.spi.BootstrapContext;
|
|
||||||
import org.hibernate.engine.config.spi.ConfigurationService;
|
|
||||||
import org.hibernate.engine.spi.CascadeStyle;
|
|
||||||
import org.hibernate.engine.spi.CascadeStyles;
|
|
||||||
import org.hibernate.engine.spi.CascadingAction;
|
|
||||||
import org.hibernate.engine.spi.CascadingActions;
|
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
|
||||||
import org.hibernate.event.service.spi.DuplicationStrategy;
|
|
||||||
import org.hibernate.event.service.spi.EventListenerGroup;
|
|
||||||
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.event.internal.CallbackBuilderLegacyImpl;
|
|
||||||
import org.hibernate.jpa.event.internal.CallbackRegistryImpl;
|
|
||||||
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.mapping.PersistentClass;
|
|
||||||
import org.hibernate.resource.beans.spi.ManagedBeanRegistry;
|
|
||||||
import org.hibernate.service.spi.ServiceRegistryImplementor;
|
|
||||||
import org.hibernate.service.spi.SessionFactoryServiceRegistry;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Hibernate EntityManager specific Integrator, performing JPA setup.
|
|
||||||
*
|
|
||||||
* @author Steve Ebersole
|
|
||||||
*/
|
|
||||||
public class JpaIntegrator implements Integrator {
|
|
||||||
private CallbackRegistryImpl callbackRegistry;
|
|
||||||
private CascadeStyle oldPersistCascadeStyle;
|
|
||||||
|
|
||||||
private static final DuplicationStrategy JPA_DUPLICATION_STRATEGY = new JPADuplicationStrategy();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Perform integration.
|
|
||||||
*
|
|
||||||
* @param metadata The "compiled" representation of the mapping information
|
|
||||||
* @param sessionFactory The session factory being created
|
|
||||||
* @param serviceRegistry The session factory's service registry
|
|
||||||
*/
|
|
||||||
public void integrate(
|
|
||||||
Metadata metadata,
|
|
||||||
SessionFactoryImplementor sessionFactory,
|
|
||||||
SessionFactoryServiceRegistry serviceRegistry) {
|
|
||||||
|
|
||||||
// first, register the JPA-specific persist cascade style
|
|
||||||
try {
|
|
||||||
oldPersistCascadeStyle = CascadeStyles.getCascadeStyle( "persist" );
|
|
||||||
}
|
|
||||||
catch (Exception e) {
|
|
||||||
|
|
||||||
}
|
|
||||||
CascadeStyles.registerCascadeStyle(
|
|
||||||
"persist",
|
|
||||||
new PersistCascadeStyle()
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
// then prepare listeners
|
|
||||||
final EventListenerRegistry eventListenerRegistry = serviceRegistry.getService( EventListenerRegistry.class );
|
|
||||||
|
|
||||||
eventListenerRegistry.addDuplicationStrategy( JPA_DUPLICATION_STRATEGY );
|
|
||||||
|
|
||||||
// op listeners
|
|
||||||
eventListenerRegistry.setListeners( EventType.AUTO_FLUSH, JpaAutoFlushEventListener.INSTANCE );
|
|
||||||
eventListenerRegistry.setListeners( EventType.DELETE, new JpaDeleteEventListener() );
|
|
||||||
eventListenerRegistry.setListeners( EventType.FLUSH_ENTITY, new JpaFlushEntityEventListener() );
|
|
||||||
eventListenerRegistry.setListeners( EventType.FLUSH, JpaFlushEventListener.INSTANCE );
|
|
||||||
eventListenerRegistry.setListeners( EventType.MERGE, new JpaMergeEventListener() );
|
|
||||||
eventListenerRegistry.setListeners( EventType.PERSIST, new JpaPersistEventListener() );
|
|
||||||
eventListenerRegistry.setListeners( EventType.PERSIST_ONFLUSH, new JpaPersistOnFlushEventListener() );
|
|
||||||
eventListenerRegistry.setListeners( EventType.SAVE, new JpaSaveEventListener() );
|
|
||||||
eventListenerRegistry.setListeners( EventType.SAVE_UPDATE, new JpaSaveOrUpdateEventListener() );
|
|
||||||
|
|
||||||
// post op listeners
|
|
||||||
eventListenerRegistry.prependListeners( EventType.POST_DELETE, new JpaPostDeleteEventListener() );
|
|
||||||
eventListenerRegistry.prependListeners( EventType.POST_INSERT, new JpaPostInsertEventListener() );
|
|
||||||
eventListenerRegistry.prependListeners( EventType.POST_LOAD, new JpaPostLoadEventListener() );
|
|
||||||
eventListenerRegistry.prependListeners( EventType.POST_UPDATE, new JpaPostUpdateEventListener() );
|
|
||||||
|
|
||||||
final ConfigurationService cfgService = serviceRegistry.getService( ConfigurationService.class );
|
|
||||||
|
|
||||||
for ( Map.Entry entry : ( (Map<?, ?>) cfgService.getSettings() ).entrySet() ) {
|
|
||||||
if ( !String.class.isInstance( entry.getKey() ) ) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
final String propertyName = (String) entry.getKey();
|
|
||||||
if ( !propertyName.startsWith( AvailableSettings.EVENT_LISTENER_PREFIX ) ) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
final String eventTypeName = propertyName.substring( AvailableSettings.EVENT_LISTENER_PREFIX.length() + 1 );
|
|
||||||
final EventType eventType = EventType.resolveEventTypeByName( eventTypeName );
|
|
||||||
final EventListenerGroup eventListenerGroup = eventListenerRegistry.getEventListenerGroup( eventType );
|
|
||||||
for ( String listenerImpl : ( (String) entry.getValue() ).split( " ," ) ) {
|
|
||||||
eventListenerGroup.appendListener( instantiate( listenerImpl, serviceRegistry ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// handle JPA "entity listener classes"...
|
|
||||||
|
|
||||||
this.callbackRegistry = new CallbackRegistryImpl();
|
|
||||||
|
|
||||||
final CallbackBuilder callbackBuilder = new CallbackBuilderLegacyImpl(
|
|
||||||
serviceRegistry.getService( ManagedBeanRegistry.class ),
|
|
||||||
//bootstrapContext.getReflectionManager()
|
|
||||||
null
|
|
||||||
);
|
|
||||||
|
|
||||||
for ( PersistentClass persistentClass : metadata.getEntityBindings() ) {
|
|
||||||
if ( persistentClass.getClassName() == null ) {
|
|
||||||
// we can have non java class persisted by hibernate
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
callbackBuilder.buildCallbacksForEntity( persistentClass.getClassName(), callbackRegistry );
|
|
||||||
}
|
|
||||||
|
|
||||||
for ( EventType eventType : EventType.values() ) {
|
|
||||||
final EventListenerGroup eventListenerGroup = eventListenerRegistry.getEventListenerGroup( eventType );
|
|
||||||
for ( Object listener : eventListenerGroup.listeners() ) {
|
|
||||||
if ( CallbackRegistryConsumer.class.isInstance( listener ) ) {
|
|
||||||
( (CallbackRegistryConsumer) listener ).injectCallbackRegistry( callbackRegistry );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void disintegrate(SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) {
|
|
||||||
if ( oldPersistCascadeStyle == null ) {
|
|
||||||
CascadeStyles.registerCascadeStyle(
|
|
||||||
"persist",
|
|
||||||
null
|
|
||||||
);
|
|
||||||
}
|
|
||||||
CascadeStyles.registerCascadeStyle(
|
|
||||||
"persist",
|
|
||||||
(CascadeStyles.BaseCascadeStyle) oldPersistCascadeStyle
|
|
||||||
);
|
|
||||||
|
|
||||||
if ( callbackRegistry != null ) {
|
|
||||||
callbackRegistry.release();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private Object instantiate(String listenerImpl, ServiceRegistryImplementor serviceRegistry) {
|
|
||||||
try {
|
|
||||||
return serviceRegistry.getService( ClassLoaderService.class ).classForName( listenerImpl ).newInstance();
|
|
||||||
}
|
|
||||||
catch (Exception e) {
|
|
||||||
throw new HibernateException( "Could not instantiate requested listener [" + listenerImpl + "]", e );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class PersistCascadeStyle extends CascadeStyles.BaseCascadeStyle {
|
|
||||||
@Override
|
|
||||||
public boolean doCascade(CascadingAction action) {
|
|
||||||
return action == JpaPersistEventListener.PERSIST_SKIPLAZY
|
|
||||||
|| action == CascadingActions.PERSIST_ON_FLUSH;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "STYLE_PERSIST_SKIPLAZY";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class JPADuplicationStrategy implements DuplicationStrategy {
|
|
||||||
@Override
|
|
||||||
public boolean areMatch(Object listener, Object original) {
|
|
||||||
return listener.getClass().equals( original.getClass() ) &&
|
|
||||||
HibernateEntityManagerEventListener.class.isInstance( original );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Action getAction() {
|
|
||||||
return Action.KEEP_ORIGINAL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
/*
|
||||||
|
* 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>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The SPI contracts for supporting JPA lifecycle callbacks.
|
||||||
|
*/
|
||||||
|
package org.hibernate.jpa.event.spi;
|
||||||
|
|
|
@ -25,7 +25,6 @@ import org.hibernate.boot.registry.StandardServiceRegistry;
|
||||||
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
||||||
import org.hibernate.cfg.AvailableSettings;
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
import org.hibernate.jpa.event.spi.JpaIntegrator;
|
|
||||||
import org.hibernate.tool.schema.Action;
|
import org.hibernate.tool.schema.Action;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
@ -51,9 +50,7 @@ public class BasicCdiTest {
|
||||||
count = 0;
|
count = 0;
|
||||||
|
|
||||||
try ( final SeContainer cdiContainer = cdiInitializer.initialize() ) {
|
try ( final SeContainer cdiContainer = cdiInitializer.initialize() ) {
|
||||||
BootstrapServiceRegistry bsr = new BootstrapServiceRegistryBuilder()
|
BootstrapServiceRegistry bsr = new BootstrapServiceRegistryBuilder().build();
|
||||||
.applyIntegrator( new JpaIntegrator() )
|
|
||||||
.build();
|
|
||||||
|
|
||||||
final StandardServiceRegistry ssr = new StandardServiceRegistryBuilder( bsr )
|
final StandardServiceRegistry ssr = new StandardServiceRegistryBuilder( bsr )
|
||||||
.applySetting( AvailableSettings.CDI_BEAN_MANAGER, cdiContainer.getBeanManager() )
|
.applySetting( AvailableSettings.CDI_BEAN_MANAGER, cdiContainer.getBeanManager() )
|
||||||
|
|
|
@ -8,11 +8,12 @@ package org.hibernate.test.bytecode.enhancement.lazy;
|
||||||
|
|
||||||
import org.hibernate.HibernateException;
|
import org.hibernate.HibernateException;
|
||||||
import org.hibernate.bytecode.enhance.spi.UnloadedClass;
|
import org.hibernate.bytecode.enhance.spi.UnloadedClass;
|
||||||
|
import org.hibernate.event.internal.DefaultFlushEventListener;
|
||||||
import org.hibernate.event.service.spi.EventListenerRegistry;
|
import org.hibernate.event.service.spi.EventListenerRegistry;
|
||||||
import org.hibernate.event.spi.EventType;
|
import org.hibernate.event.spi.EventType;
|
||||||
import org.hibernate.event.spi.LoadEvent;
|
import org.hibernate.event.spi.LoadEvent;
|
||||||
import org.hibernate.event.spi.LoadEventListener;
|
import org.hibernate.event.spi.LoadEventListener;
|
||||||
import org.hibernate.jpa.event.internal.core.JpaFlushEventListener;
|
|
||||||
import org.hibernate.testing.TestForIssue;
|
import org.hibernate.testing.TestForIssue;
|
||||||
import org.hibernate.testing.bytecode.enhancement.BytecodeEnhancerRunner;
|
import org.hibernate.testing.bytecode.enhancement.BytecodeEnhancerRunner;
|
||||||
import org.hibernate.testing.bytecode.enhancement.CustomEnhancementContext;
|
import org.hibernate.testing.bytecode.enhancement.CustomEnhancementContext;
|
||||||
|
@ -63,7 +64,6 @@ public class LazyProxyOnEnhancedEntityTest extends BaseCoreFunctionalTestCase {
|
||||||
@Test
|
@Test
|
||||||
public void test() {
|
public void test() {
|
||||||
EventListenerRegistry registry = sessionFactory().getServiceRegistry().getService( EventListenerRegistry.class );
|
EventListenerRegistry registry = sessionFactory().getServiceRegistry().getService( EventListenerRegistry.class );
|
||||||
registry.prependListeners( EventType.FLUSH, new JpaFlushEventListener() );
|
|
||||||
registry.prependListeners( EventType.LOAD, new ImmediateLoadTrap() );
|
registry.prependListeners( EventType.LOAD, new ImmediateLoadTrap() );
|
||||||
|
|
||||||
doInJPA( this::sessionFactory, em -> {
|
doInJPA( this::sessionFactory, em -> {
|
||||||
|
|
|
@ -16,7 +16,6 @@ import org.hibernate.boot.registry.StandardServiceRegistry;
|
||||||
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
||||||
import org.hibernate.cfg.AvailableSettings;
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
import org.hibernate.jpa.event.spi.JpaIntegrator;
|
|
||||||
import org.hibernate.tool.schema.Action;
|
import org.hibernate.tool.schema.Action;
|
||||||
|
|
||||||
import org.hibernate.testing.junit4.BaseUnitTestCase;
|
import org.hibernate.testing.junit4.BaseUnitTestCase;
|
||||||
|
@ -43,9 +42,7 @@ public class DelayedCdiHostedConverterTest extends BaseUnitTestCase {
|
||||||
.disableDiscovery()
|
.disableDiscovery()
|
||||||
.addBeanClasses( MonitorBean.class, ConverterBean.class );
|
.addBeanClasses( MonitorBean.class, ConverterBean.class );
|
||||||
try ( final SeContainer cdiContainer = cdiInitializer.initialize() ) {
|
try ( final SeContainer cdiContainer = cdiInitializer.initialize() ) {
|
||||||
BootstrapServiceRegistry bsr = new BootstrapServiceRegistryBuilder()
|
BootstrapServiceRegistry bsr = new BootstrapServiceRegistryBuilder().build();
|
||||||
.applyIntegrator( new JpaIntegrator() )
|
|
||||||
.build();
|
|
||||||
|
|
||||||
final StandardServiceRegistry ssr = new StandardServiceRegistryBuilder( bsr )
|
final StandardServiceRegistry ssr = new StandardServiceRegistryBuilder( bsr )
|
||||||
.applySetting( AvailableSettings.HBM2DDL_AUTO, Action.CREATE_DROP )
|
.applySetting( AvailableSettings.HBM2DDL_AUTO, Action.CREATE_DROP )
|
||||||
|
|
|
@ -16,7 +16,6 @@ import org.hibernate.boot.registry.StandardServiceRegistry;
|
||||||
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
||||||
import org.hibernate.cfg.AvailableSettings;
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
import org.hibernate.jpa.event.spi.JpaIntegrator;
|
|
||||||
import org.hibernate.tool.schema.Action;
|
import org.hibernate.tool.schema.Action;
|
||||||
|
|
||||||
import org.hibernate.testing.junit4.BaseUnitTestCase;
|
import org.hibernate.testing.junit4.BaseUnitTestCase;
|
||||||
|
@ -42,9 +41,7 @@ public class CdiHostedConverterTest extends BaseUnitTestCase {
|
||||||
.disableDiscovery()
|
.disableDiscovery()
|
||||||
.addBeanClasses( MonitorBean.class, ConverterBean.class );
|
.addBeanClasses( MonitorBean.class, ConverterBean.class );
|
||||||
try ( final SeContainer cdiContainer = cdiInitializer.initialize() ) {
|
try ( final SeContainer cdiContainer = cdiInitializer.initialize() ) {
|
||||||
BootstrapServiceRegistry bsr = new BootstrapServiceRegistryBuilder()
|
BootstrapServiceRegistry bsr = new BootstrapServiceRegistryBuilder().build();
|
||||||
.applyIntegrator( new JpaIntegrator() )
|
|
||||||
.build();
|
|
||||||
|
|
||||||
final StandardServiceRegistry ssr = new StandardServiceRegistryBuilder( bsr )
|
final StandardServiceRegistry ssr = new StandardServiceRegistryBuilder( bsr )
|
||||||
.applySetting( AvailableSettings.HBM2DDL_AUTO, Action.CREATE_DROP )
|
.applySetting( AvailableSettings.HBM2DDL_AUTO, Action.CREATE_DROP )
|
||||||
|
|
|
@ -16,7 +16,6 @@ import org.hibernate.boot.registry.StandardServiceRegistry;
|
||||||
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
||||||
import org.hibernate.cfg.AvailableSettings;
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
import org.hibernate.jpa.event.spi.JpaIntegrator;
|
|
||||||
import org.hibernate.tool.schema.Action;
|
import org.hibernate.tool.schema.Action;
|
||||||
|
|
||||||
import org.hibernate.testing.junit4.BaseUnitTestCase;
|
import org.hibernate.testing.junit4.BaseUnitTestCase;
|
||||||
|
@ -46,9 +45,7 @@ public class DelayedCdiSupportTest extends BaseUnitTestCase {
|
||||||
.disableDiscovery()
|
.disableDiscovery()
|
||||||
.addBeanClasses( Monitor.class, TheListener.class );
|
.addBeanClasses( Monitor.class, TheListener.class );
|
||||||
try ( final SeContainer cdiContainer = cdiInitializer.initialize() ) {
|
try ( final SeContainer cdiContainer = cdiInitializer.initialize() ) {
|
||||||
BootstrapServiceRegistry bsr = new BootstrapServiceRegistryBuilder()
|
BootstrapServiceRegistry bsr = new BootstrapServiceRegistryBuilder().build();
|
||||||
.applyIntegrator( new JpaIntegrator() )
|
|
||||||
.build();
|
|
||||||
|
|
||||||
final StandardServiceRegistry ssr = new StandardServiceRegistryBuilder( bsr )
|
final StandardServiceRegistry ssr = new StandardServiceRegistryBuilder( bsr )
|
||||||
.applySetting( AvailableSettings.HBM2DDL_AUTO, Action.CREATE_DROP )
|
.applySetting( AvailableSettings.HBM2DDL_AUTO, Action.CREATE_DROP )
|
||||||
|
|
|
@ -13,7 +13,6 @@ import org.hibernate.boot.registry.StandardServiceRegistry;
|
||||||
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
||||||
import org.hibernate.cfg.AvailableSettings;
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
import org.hibernate.jpa.event.spi.JpaIntegrator;
|
|
||||||
import org.hibernate.jpa.event.spi.jpa.ExtendedBeanManager;
|
import org.hibernate.jpa.event.spi.jpa.ExtendedBeanManager;
|
||||||
import org.hibernate.tool.schema.Action;
|
import org.hibernate.tool.schema.Action;
|
||||||
|
|
||||||
|
@ -40,9 +39,7 @@ public class InvalidExtendedCdiSupportTest extends BaseUnitTestCase {
|
||||||
|
|
||||||
final ExtendedBeanManagerImpl standIn = new ExtendedBeanManagerImpl();
|
final ExtendedBeanManagerImpl standIn = new ExtendedBeanManagerImpl();
|
||||||
|
|
||||||
BootstrapServiceRegistry bsr = new BootstrapServiceRegistryBuilder()
|
BootstrapServiceRegistry bsr = new BootstrapServiceRegistryBuilder().build();
|
||||||
.applyIntegrator( new JpaIntegrator() )
|
|
||||||
.build();
|
|
||||||
|
|
||||||
final StandardServiceRegistry ssr = new StandardServiceRegistryBuilder( bsr )
|
final StandardServiceRegistry ssr = new StandardServiceRegistryBuilder( bsr )
|
||||||
.applySetting( AvailableSettings.HBM2DDL_AUTO, Action.CREATE_DROP )
|
.applySetting( AvailableSettings.HBM2DDL_AUTO, Action.CREATE_DROP )
|
||||||
|
|
|
@ -17,7 +17,6 @@ import org.hibernate.boot.registry.StandardServiceRegistry;
|
||||||
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
||||||
import org.hibernate.cfg.AvailableSettings;
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
import org.hibernate.jpa.event.spi.JpaIntegrator;
|
|
||||||
import org.hibernate.jpa.event.spi.jpa.ExtendedBeanManager;
|
import org.hibernate.jpa.event.spi.jpa.ExtendedBeanManager;
|
||||||
import org.hibernate.tool.schema.Action;
|
import org.hibernate.tool.schema.Action;
|
||||||
|
|
||||||
|
@ -47,9 +46,7 @@ public class ValidExtendedCdiSupportTest extends BaseUnitTestCase {
|
||||||
|
|
||||||
final ExtendedBeanManagerImpl standIn = new ExtendedBeanManagerImpl();
|
final ExtendedBeanManagerImpl standIn = new ExtendedBeanManagerImpl();
|
||||||
|
|
||||||
BootstrapServiceRegistry bsr = new BootstrapServiceRegistryBuilder()
|
BootstrapServiceRegistry bsr = new BootstrapServiceRegistryBuilder().build();
|
||||||
.applyIntegrator( new JpaIntegrator() )
|
|
||||||
.build();
|
|
||||||
|
|
||||||
final StandardServiceRegistry ssr = new StandardServiceRegistryBuilder( bsr )
|
final StandardServiceRegistry ssr = new StandardServiceRegistryBuilder( bsr )
|
||||||
.applySetting( AvailableSettings.HBM2DDL_AUTO, Action.CREATE_DROP )
|
.applySetting( AvailableSettings.HBM2DDL_AUTO, Action.CREATE_DROP )
|
||||||
|
|
|
@ -14,7 +14,6 @@ import org.hibernate.boot.registry.StandardServiceRegistry;
|
||||||
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
||||||
import org.hibernate.cfg.AvailableSettings;
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
import org.hibernate.jpa.event.spi.JpaIntegrator;
|
|
||||||
import org.hibernate.tool.schema.Action;
|
import org.hibernate.tool.schema.Action;
|
||||||
|
|
||||||
import org.hibernate.testing.junit4.BaseUnitTestCase;
|
import org.hibernate.testing.junit4.BaseUnitTestCase;
|
||||||
|
@ -36,9 +35,7 @@ public class InvalidNoCdiSupportTest extends BaseUnitTestCase {
|
||||||
public void testIt() {
|
public void testIt() {
|
||||||
Monitor.reset();
|
Monitor.reset();
|
||||||
|
|
||||||
BootstrapServiceRegistry bsr = new BootstrapServiceRegistryBuilder()
|
BootstrapServiceRegistry bsr = new BootstrapServiceRegistryBuilder().build();
|
||||||
.applyIntegrator( new JpaIntegrator() )
|
|
||||||
.build();
|
|
||||||
|
|
||||||
final StandardServiceRegistry ssr = new StandardServiceRegistryBuilder( bsr )
|
final StandardServiceRegistry ssr = new StandardServiceRegistryBuilder( bsr )
|
||||||
.applySetting( AvailableSettings.HBM2DDL_AUTO, Action.CREATE_DROP )
|
.applySetting( AvailableSettings.HBM2DDL_AUTO, Action.CREATE_DROP )
|
||||||
|
|
|
@ -20,11 +20,9 @@ import org.hibernate.boot.registry.StandardServiceRegistry;
|
||||||
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
||||||
import org.hibernate.cfg.AvailableSettings;
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
import org.hibernate.jpa.event.spi.JpaIntegrator;
|
|
||||||
import org.hibernate.tool.schema.Action;
|
import org.hibernate.tool.schema.Action;
|
||||||
|
|
||||||
import org.hibernate.testing.junit4.BaseUnitTestCase;
|
import org.hibernate.testing.junit4.BaseUnitTestCase;
|
||||||
import org.hibernate.test.cdi.events.Monitor;
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import static org.hibernate.testing.transaction.TransactionUtil2.inTransaction;
|
import static org.hibernate.testing.transaction.TransactionUtil2.inTransaction;
|
||||||
|
@ -43,9 +41,7 @@ public class ValidNoCdiSupportTest extends BaseUnitTestCase {
|
||||||
public void testIt() {
|
public void testIt() {
|
||||||
AnotherListener.reset();
|
AnotherListener.reset();
|
||||||
|
|
||||||
BootstrapServiceRegistry bsr = new BootstrapServiceRegistryBuilder()
|
BootstrapServiceRegistry bsr = new BootstrapServiceRegistryBuilder().build();
|
||||||
.applyIntegrator( new JpaIntegrator() )
|
|
||||||
.build();
|
|
||||||
|
|
||||||
final StandardServiceRegistry ssr = new StandardServiceRegistryBuilder( bsr )
|
final StandardServiceRegistry ssr = new StandardServiceRegistryBuilder( bsr )
|
||||||
.applySetting( AvailableSettings.HBM2DDL_AUTO, Action.CREATE_DROP )
|
.applySetting( AvailableSettings.HBM2DDL_AUTO, Action.CREATE_DROP )
|
||||||
|
|
|
@ -16,7 +16,6 @@ import org.hibernate.boot.registry.StandardServiceRegistry;
|
||||||
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
||||||
import org.hibernate.cfg.AvailableSettings;
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
import org.hibernate.jpa.event.spi.JpaIntegrator;
|
|
||||||
import org.hibernate.tool.schema.Action;
|
import org.hibernate.tool.schema.Action;
|
||||||
|
|
||||||
import org.hibernate.testing.junit4.BaseUnitTestCase;
|
import org.hibernate.testing.junit4.BaseUnitTestCase;
|
||||||
|
@ -45,9 +44,7 @@ public class StandardCdiSupportTest extends BaseUnitTestCase {
|
||||||
.disableDiscovery()
|
.disableDiscovery()
|
||||||
.addBeanClasses( Monitor.class, TheListener.class );
|
.addBeanClasses( Monitor.class, TheListener.class );
|
||||||
try ( final SeContainer cdiContainer = cdiInitializer.initialize() ) {
|
try ( final SeContainer cdiContainer = cdiInitializer.initialize() ) {
|
||||||
BootstrapServiceRegistry bsr = new BootstrapServiceRegistryBuilder()
|
BootstrapServiceRegistry bsr = new BootstrapServiceRegistryBuilder().build();
|
||||||
.applyIntegrator( new JpaIntegrator() )
|
|
||||||
.build();
|
|
||||||
|
|
||||||
final StandardServiceRegistry ssr = new StandardServiceRegistryBuilder( bsr )
|
final StandardServiceRegistry ssr = new StandardServiceRegistryBuilder( bsr )
|
||||||
.applySetting( AvailableSettings.HBM2DDL_AUTO, Action.CREATE_DROP )
|
.applySetting( AvailableSettings.HBM2DDL_AUTO, Action.CREATE_DROP )
|
||||||
|
|
|
@ -13,7 +13,6 @@ import org.hibernate.boot.registry.BootstrapServiceRegistryBuilder;
|
||||||
import org.hibernate.boot.registry.StandardServiceRegistry;
|
import org.hibernate.boot.registry.StandardServiceRegistry;
|
||||||
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
||||||
import org.hibernate.cfg.AvailableSettings;
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
import org.hibernate.jpa.event.spi.JpaIntegrator;
|
|
||||||
import org.hibernate.resource.beans.container.internal.CdiBeanContainerBuilder;
|
import org.hibernate.resource.beans.container.internal.CdiBeanContainerBuilder;
|
||||||
import org.hibernate.resource.beans.container.internal.CdiBeanContainerDelayedAccessImpl;
|
import org.hibernate.resource.beans.container.internal.CdiBeanContainerDelayedAccessImpl;
|
||||||
import org.hibernate.resource.beans.container.spi.BeanContainer;
|
import org.hibernate.resource.beans.container.spi.BeanContainer;
|
||||||
|
@ -44,9 +43,7 @@ public class DelayedMixedAccessTest implements BeanContainer.LifecycleOptions {
|
||||||
@Test
|
@Test
|
||||||
public void testDelayedMixedAccess() {
|
public void testDelayedMixedAccess() {
|
||||||
try ( final SeContainer cdiContainer = Helper.createSeContainer() ) {
|
try ( final SeContainer cdiContainer = Helper.createSeContainer() ) {
|
||||||
BootstrapServiceRegistry bsr = new BootstrapServiceRegistryBuilder()
|
BootstrapServiceRegistry bsr = new BootstrapServiceRegistryBuilder().build();
|
||||||
.applyIntegrator( new JpaIntegrator() )
|
|
||||||
.build();
|
|
||||||
|
|
||||||
final StandardServiceRegistry ssr = new StandardServiceRegistryBuilder( bsr )
|
final StandardServiceRegistry ssr = new StandardServiceRegistryBuilder( bsr )
|
||||||
.applySetting( AvailableSettings.HBM2DDL_AUTO, Action.CREATE_DROP )
|
.applySetting( AvailableSettings.HBM2DDL_AUTO, Action.CREATE_DROP )
|
||||||
|
|
|
@ -13,10 +13,8 @@ import org.hibernate.boot.registry.BootstrapServiceRegistryBuilder;
|
||||||
import org.hibernate.boot.registry.StandardServiceRegistry;
|
import org.hibernate.boot.registry.StandardServiceRegistry;
|
||||||
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
||||||
import org.hibernate.cfg.AvailableSettings;
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
import org.hibernate.jpa.event.spi.JpaIntegrator;
|
|
||||||
import org.hibernate.resource.beans.container.internal.CdiBeanContainerBuilder;
|
import org.hibernate.resource.beans.container.internal.CdiBeanContainerBuilder;
|
||||||
import org.hibernate.resource.beans.container.internal.CdiBeanContainerImmediateAccessImpl;
|
import org.hibernate.resource.beans.container.internal.CdiBeanContainerImmediateAccessImpl;
|
||||||
import org.hibernate.resource.beans.container.internal.JpaCompliantLifecycleStrategy;
|
|
||||||
import org.hibernate.resource.beans.container.spi.BeanContainer;
|
import org.hibernate.resource.beans.container.spi.BeanContainer;
|
||||||
import org.hibernate.resource.beans.container.spi.ContainedBean;
|
import org.hibernate.resource.beans.container.spi.ContainedBean;
|
||||||
import org.hibernate.resource.beans.internal.FallbackBeanInstanceProducer;
|
import org.hibernate.resource.beans.internal.FallbackBeanInstanceProducer;
|
||||||
|
@ -47,9 +45,7 @@ public class ImmediateMixedAccessTests implements BeanContainer.LifecycleOptions
|
||||||
@Test
|
@Test
|
||||||
public void testImmediateMixedAccess() {
|
public void testImmediateMixedAccess() {
|
||||||
try ( final SeContainer cdiContainer = Helper.createSeContainer() ) {
|
try ( final SeContainer cdiContainer = Helper.createSeContainer() ) {
|
||||||
BootstrapServiceRegistry bsr = new BootstrapServiceRegistryBuilder()
|
BootstrapServiceRegistry bsr = new BootstrapServiceRegistryBuilder().build();
|
||||||
.applyIntegrator( new JpaIntegrator() )
|
|
||||||
.build();
|
|
||||||
|
|
||||||
final StandardServiceRegistry ssr = new StandardServiceRegistryBuilder( bsr )
|
final StandardServiceRegistry ssr = new StandardServiceRegistryBuilder( bsr )
|
||||||
.applySetting( AvailableSettings.HBM2DDL_AUTO, Action.CREATE_DROP )
|
.applySetting( AvailableSettings.HBM2DDL_AUTO, Action.CREATE_DROP )
|
||||||
|
|
|
@ -17,7 +17,6 @@ import org.hibernate.boot.registry.StandardServiceRegistry;
|
||||||
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
||||||
import org.hibernate.cfg.AvailableSettings;
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
import org.hibernate.jpa.event.spi.JpaIntegrator;
|
|
||||||
import org.hibernate.resource.beans.spi.ManagedBeanRegistry;
|
import org.hibernate.resource.beans.spi.ManagedBeanRegistry;
|
||||||
import org.hibernate.tool.schema.Action;
|
import org.hibernate.tool.schema.Action;
|
||||||
|
|
||||||
|
@ -170,7 +169,6 @@ public class NonRegistryManagedDelayedCdiSupportTest extends BaseUnitTestCase {
|
||||||
private SessionFactoryImplementor buildSessionFactory(SeContainer cdiContainer,
|
private SessionFactoryImplementor buildSessionFactory(SeContainer cdiContainer,
|
||||||
NonRegistryManagedBeanConsumingIntegrator beanConsumingIntegrator) {
|
NonRegistryManagedBeanConsumingIntegrator beanConsumingIntegrator) {
|
||||||
BootstrapServiceRegistry bsr = new BootstrapServiceRegistryBuilder()
|
BootstrapServiceRegistry bsr = new BootstrapServiceRegistryBuilder()
|
||||||
.applyIntegrator( new JpaIntegrator() )
|
|
||||||
.applyIntegrator( beanConsumingIntegrator )
|
.applyIntegrator( beanConsumingIntegrator )
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,6 @@ import org.hibernate.boot.registry.StandardServiceRegistry;
|
||||||
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
||||||
import org.hibernate.cfg.AvailableSettings;
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
import org.hibernate.jpa.event.spi.JpaIntegrator;
|
|
||||||
import org.hibernate.jpa.event.spi.jpa.ExtendedBeanManager;
|
import org.hibernate.jpa.event.spi.jpa.ExtendedBeanManager;
|
||||||
import org.hibernate.resource.beans.spi.ManagedBeanRegistry;
|
import org.hibernate.resource.beans.spi.ManagedBeanRegistry;
|
||||||
import org.hibernate.tool.schema.Action;
|
import org.hibernate.tool.schema.Action;
|
||||||
|
@ -168,7 +167,6 @@ public class NonRegistryManagedExtendedCdiSupportTest extends BaseUnitTestCase {
|
||||||
private SessionFactoryImplementor buildSessionFactory(ExtendedBeanManagerImpl standIn,
|
private SessionFactoryImplementor buildSessionFactory(ExtendedBeanManagerImpl standIn,
|
||||||
NonRegistryManagedBeanConsumingIntegrator beanConsumingIntegrator) {
|
NonRegistryManagedBeanConsumingIntegrator beanConsumingIntegrator) {
|
||||||
BootstrapServiceRegistry bsr = new BootstrapServiceRegistryBuilder()
|
BootstrapServiceRegistry bsr = new BootstrapServiceRegistryBuilder()
|
||||||
.applyIntegrator( new JpaIntegrator() )
|
|
||||||
.applyIntegrator( beanConsumingIntegrator )
|
.applyIntegrator( beanConsumingIntegrator )
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,6 @@ import org.hibernate.boot.registry.StandardServiceRegistry;
|
||||||
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
||||||
import org.hibernate.cfg.AvailableSettings;
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
import org.hibernate.jpa.event.spi.JpaIntegrator;
|
|
||||||
import org.hibernate.resource.beans.spi.ManagedBeanRegistry;
|
import org.hibernate.resource.beans.spi.ManagedBeanRegistry;
|
||||||
import org.hibernate.tool.schema.Action;
|
import org.hibernate.tool.schema.Action;
|
||||||
|
|
||||||
|
@ -169,7 +168,6 @@ public class NonRegistryManagedStandardCdiSupportTest extends BaseUnitTestCase {
|
||||||
private SessionFactoryImplementor buildSessionFactory(SeContainer cdiContainer,
|
private SessionFactoryImplementor buildSessionFactory(SeContainer cdiContainer,
|
||||||
NonRegistryManagedBeanConsumingIntegrator beanConsumingIntegrator) {
|
NonRegistryManagedBeanConsumingIntegrator beanConsumingIntegrator) {
|
||||||
BootstrapServiceRegistry bsr = new BootstrapServiceRegistryBuilder()
|
BootstrapServiceRegistry bsr = new BootstrapServiceRegistryBuilder()
|
||||||
.applyIntegrator( new JpaIntegrator() )
|
|
||||||
.applyIntegrator( beanConsumingIntegrator )
|
.applyIntegrator( beanConsumingIntegrator )
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue