From 83a226c5038b777c94a47cb41b3a9baa25f0a7c1 Mon Sep 17 00:00:00 2001 From: Andrea Boriero Date: Wed, 24 Jul 2024 19:38:10 +0200 Subject: [PATCH] HHH-18196 Remove Session#save / Session#update / Session#saveOrUpdate --- .../main/java/org/hibernate/Interceptor.java | 1 - .../src/main/java/org/hibernate/Session.java | 100 ------ .../hibernate/annotations/CascadeType.java | 11 - .../boot/model/internal/BinderHelper.java | 4 - .../hibernate/engine/spi/CascadeStyles.java | 18 - .../engine/spi/CascadingActions.java | 42 --- .../engine/spi/SessionDelegatorBaseImpl.java | 31 -- .../engine/spi/SessionLazyDelegator.java | 36 -- .../AbstractFlushingEventListener.java | 6 +- .../internal/DefaultSaveEventListener.java | 45 --- .../DefaultSaveOrUpdateEventListener.java | 340 ------------------ .../internal/DefaultUpdateEventListener.java | 62 ---- .../internal/EventListenerRegistryImpl.java | 15 - .../org/hibernate/event/spi/EventType.java | 3 - .../event/spi/SaveOrUpdateEventListener.java | 28 -- .../id/IdentifierGeneratorHelper.java | 3 +- .../internal/FastSessionServices.java | 7 - .../org/hibernate/internal/SessionImpl.java | 68 ---- .../DefaultRevisionInfoGenerator.java | 2 +- .../internal/DefaultAuditStrategy.java | 4 +- .../internal/ValidityAuditStrategy.java | 6 +- .../graalvm/internal/StaticClassLists.java | 1 - 22 files changed, 10 insertions(+), 823 deletions(-) delete mode 100644 hibernate-core/src/main/java/org/hibernate/event/internal/DefaultSaveEventListener.java delete mode 100644 hibernate-core/src/main/java/org/hibernate/event/internal/DefaultSaveOrUpdateEventListener.java delete mode 100644 hibernate-core/src/main/java/org/hibernate/event/internal/DefaultUpdateEventListener.java delete mode 100644 hibernate-core/src/main/java/org/hibernate/event/spi/SaveOrUpdateEventListener.java diff --git a/hibernate-core/src/main/java/org/hibernate/Interceptor.java b/hibernate-core/src/main/java/org/hibernate/Interceptor.java index d0d35cd6dd..a3a033bfc1 100644 --- a/hibernate-core/src/main/java/org/hibernate/Interceptor.java +++ b/hibernate-core/src/main/java/org/hibernate/Interceptor.java @@ -264,7 +264,6 @@ public interface Interceptor { * * @see Session#persist(Object) * @see Session#merge(Object) - * @see Session#save(Object) * * @deprecated Use {@link #onPersist(Object, Object, Object[], String[], Type[])} */ diff --git a/hibernate-core/src/main/java/org/hibernate/Session.java b/hibernate-core/src/main/java/org/hibernate/Session.java index ce41710fb5..ca1c253137 100644 --- a/hibernate-core/src/main/java/org/hibernate/Session.java +++ b/hibernate-core/src/main/java/org/hibernate/Session.java @@ -620,106 +620,6 @@ public interface Session extends SharedSessionContract, EntityManager { @Deprecated( since = "6.0" ) void replicate(String entityName, Object object, ReplicationMode replicationMode) ; - /** - * Persist the given transient instance, first assigning a generated identifier. - * (Or using the current value of the identifier property if the {@code assigned} - * generator is used.) This operation cascades to associated instances if the - * association is mapped with - * {@link org.hibernate.annotations.CascadeType#SAVE_UPDATE}. - *

- * This operation is very similar to {@link #persist(Object)}. - * - * @param object a transient instance of a persistent class - * - * @return the generated identifier - * - * @deprecated use {@link #persist(Object)} - */ - @Deprecated(since = "6.0") - Object save(Object object); - - /** - * Persist the given transient instance, first assigning a generated identifier. - * (Or using the current value of the identifier property if the {@code assigned} - * generator is used.) This operation cascades to associated instances if the - * association is mapped with {@link org.hibernate.annotations.CascadeType#SAVE_UPDATE}. - * - * @param entityName the entity name - * @param object a transient instance of a persistent class - * - * @return the generated identifier - * - * @deprecated use {@link #persist(String, Object)} - */ - @Deprecated(since = "6.0") - Object save(String entityName, Object object); - - /** - * Either {@link #save(Object)} or {@link #update(Object)} the given - * instance, depending upon resolution of the unsaved-value checks (see the - * manual for discussion of unsaved-value checking). - *

- * This operation cascades to associated instances if the association is mapped - * with {@link org.hibernate.annotations.CascadeType#SAVE_UPDATE}. - * - * @param object a transient or detached instance containing new or updated state - * - * @see Session#save(Object) - * @see Session#update(Object object) - * - * @deprecated use {@link #merge(String, Object)} or {@link #persist(Object)} - */ - @Deprecated(since = "6.0") - void saveOrUpdate(Object object); - - /** - * Either {@link #save(String, Object)} or {@link #update(String, Object)} - * the given instance, depending upon resolution of the unsaved-value checks - * (see the manual for discussion of unsaved-value checking). - *

- * This operation cascades to associated instances if the association is mapped - * with {@link org.hibernate.annotations.CascadeType#SAVE_UPDATE}. - * - * @param entityName the entity name - * @param object a transient or detached instance containing new or updated state - * - * @see Session#save(String,Object) - * @see Session#update(String,Object) - * - * @deprecated use {@link #merge(String, Object)} or {@link #persist(String, Object)} - */ - @Deprecated(since = "6.0") - void saveOrUpdate(String entityName, Object object); - - /** - * Update the persistent instance with the identifier of the given detached - * instance. If there is a persistent instance with the same identifier, - * an exception is thrown. This operation cascades to associated instances - * if the association is mapped with - * {@link org.hibernate.annotations.CascadeType#SAVE_UPDATE}. - * - * @param object a detached instance containing updated state - * - * @deprecated use {@link #merge(Object)} - */ - @Deprecated(since = "6.0") - void update(Object object); - - /** - * Update the persistent instance with the identifier of the given detached - * instance. If there is a persistent instance with the same identifier, - * an exception is thrown. This operation cascades to associated instances - * if the association is mapped with - * {@link org.hibernate.annotations.CascadeType#SAVE_UPDATE}. - * - * @param entityName the entity name - * @param object a detached instance containing updated state - * - * @deprecated use {@link #merge(String, Object)} - */ - @Deprecated(since = "6.0") - void update(String entityName, Object object); - /** * Copy the state of the given object onto the persistent object with the same * identifier. If there is no persistent instance currently associated with diff --git a/hibernate-core/src/main/java/org/hibernate/annotations/CascadeType.java b/hibernate-core/src/main/java/org/hibernate/annotations/CascadeType.java index 9902e39b6c..4f8b976895 100644 --- a/hibernate-core/src/main/java/org/hibernate/annotations/CascadeType.java +++ b/hibernate-core/src/main/java/org/hibernate/annotations/CascadeType.java @@ -95,17 +95,6 @@ public enum CascadeType { @Deprecated DELETE, - /** - * A cascade type for the {@code saveOrUpdate()} operation. - * - * @see org.hibernate.Session#saveOrUpdate(Object) - * - * @deprecated since {@link org.hibernate.Session#saveOrUpdate(Object)} - * is deprecated - */ - @Deprecated - SAVE_UPDATE, - /** * A cascade type for the {@code replicate()} operation. * diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/BinderHelper.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/BinderHelper.java index a8a160962e..62da318fc7 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/BinderHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/BinderHelper.java @@ -1019,10 +1019,6 @@ public class BinderHelper { case DELETE_ORPHAN: cascade.append( "," ).append( "delete-orphan" ); break; - case SAVE_UPDATE: - warnAboutDeprecatedCascadeType( CascadeType.SAVE_UPDATE ); - cascade.append( "," ).append( "save-update" ); - break; case REPLICATE: warnAboutDeprecatedCascadeType( CascadeType.REPLICATE ); cascade.append( "," ).append( "replicate" ); diff --git a/hibernate-core/src/main/java/org/hibernate/engine/spi/CascadeStyles.java b/hibernate-core/src/main/java/org/hibernate/engine/spi/CascadeStyles.java index 7d38ceb185..c172d6339e 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/spi/CascadeStyles.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/spi/CascadeStyles.java @@ -62,22 +62,6 @@ public final class CascadeStyles { } }; - /** - * save / update - */ - public static final CascadeStyle UPDATE = new BaseCascadeStyle() { - @Override - public boolean doCascade(CascadingAction action) { - return action == CascadingActions.SAVE_UPDATE - || action == CascadingActions.CHECK_ON_FLUSH; - } - - @Override - public String toString() { - return "STYLE_SAVE_UPDATE"; - } - }; - /** * lock */ @@ -197,7 +181,6 @@ public final class CascadeStyles { @Override public boolean doCascade(CascadingAction action) { return action == CascadingActions.REMOVE - || action == CascadingActions.SAVE_UPDATE || action == CascadingActions.PERSIST_ON_FLUSH || action == CascadingActions.CHECK_ON_FLUSH; } @@ -241,7 +224,6 @@ public final class CascadeStyles { base.put( "all", ALL ); base.put( "all-delete-orphan", ALL_DELETE_ORPHAN ); - base.put( "save-update", UPDATE ); base.put( "persist", PERSIST ); base.put( "merge", MERGE ); base.put( "lock", LOCK ); diff --git a/hibernate-core/src/main/java/org/hibernate/engine/spi/CascadingActions.java b/hibernate-core/src/main/java/org/hibernate/engine/spi/CascadingActions.java index f58cda812f..1f8f0e76a7 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/spi/CascadingActions.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/spi/CascadingActions.java @@ -200,48 +200,6 @@ public class CascadingActions { } }; - /** - * @see org.hibernate.Session#saveOrUpdate(Object) - */ - public static final CascadingAction SAVE_UPDATE = new BaseCascadingAction<>() { - @Override - public void cascade( - EventSource session, - Object child, - String entityName, - PersistContext nothing, - boolean isCascadeDeleteEnabled) - throws HibernateException { - LOG.tracev( "Cascading to save or update: {0}", entityName ); - session.saveOrUpdate( entityName, child ); - } - - @Override - public Iterator getCascadableChildrenIterator( - EventSource session, - CollectionType collectionType, - Object collection) { - // saves / updates don't cascade to uninitialized collections - return getLoadedElementsIterator( session, collectionType, collection ); - } - - @Override - public boolean deleteOrphans() { - // orphans should be deleted during save/update - return true; - } - - @Override - public boolean performOnLazyProperty() { - return false; - } - - @Override - public String toString() { - return "ACTION_SAVE_UPDATE"; - } - }; - /** * @see org.hibernate.Session#merge(Object) */ diff --git a/hibernate-core/src/main/java/org/hibernate/engine/spi/SessionDelegatorBaseImpl.java b/hibernate-core/src/main/java/org/hibernate/engine/spi/SessionDelegatorBaseImpl.java index 09b71579e0..dfc8561de2 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/spi/SessionDelegatorBaseImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/spi/SessionDelegatorBaseImpl.java @@ -36,7 +36,6 @@ import org.hibernate.engine.jdbc.LobCreator; import org.hibernate.engine.jdbc.connections.spi.JdbcConnectionAccess; import org.hibernate.engine.jdbc.spi.JdbcCoordinator; import org.hibernate.engine.jdbc.spi.JdbcServices; -import org.hibernate.event.spi.AutoFlushEvent; import org.hibernate.event.spi.EventManager; import org.hibernate.event.spi.DeleteContext; import org.hibernate.event.spi.EventSource; @@ -858,36 +857,6 @@ public class SessionDelegatorBaseImpl implements SessionImplementor { delegate.replicate( entityName, object, replicationMode ); } - @Override - public Object save(Object object) { - return delegate.save( object ); - } - - @Override - public Object save(String entityName, Object object) { - return delegate.save( entityName, object ); - } - - @Override - public void saveOrUpdate(Object object) { - delegate.saveOrUpdate( object ); - } - - @Override - public void saveOrUpdate(String entityName, Object object) { - delegate.saveOrUpdate( entityName, object ); - } - - @Override - public void update(Object object) { - delegate.update( object ); - } - - @Override - public void update(String entityName, Object object) { - delegate.update( entityName, object ); - } - @Override public T merge(T object) { return delegate.merge( object ); diff --git a/hibernate-core/src/main/java/org/hibernate/engine/spi/SessionLazyDelegator.java b/hibernate-core/src/main/java/org/hibernate/engine/spi/SessionLazyDelegator.java index de812aab77..98fa0b66af 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/spi/SessionLazyDelegator.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/spi/SessionLazyDelegator.java @@ -239,42 +239,6 @@ public class SessionLazyDelegator implements Session { this.lazySession.get().replicate( entityName, object, replicationMode ); } - @Override - @Deprecated - public Object save(Object object) { - return this.lazySession.get().save( object ); - } - - @Override - @Deprecated - public Object save(String entityName, Object object) { - return this.lazySession.get().save( entityName, object ); - } - - @Override - @Deprecated - public void saveOrUpdate(Object object) { - this.lazySession.get().saveOrUpdate( object ); - } - - @Override - @Deprecated - public void saveOrUpdate(String entityName, Object object) { - this.lazySession.get().saveOrUpdate( entityName, object ); - } - - @Override - @Deprecated - public void update(Object object) { - this.lazySession.get().update( object ); - } - - @Override - @Deprecated - public void update(String entityName, Object object) { - this.lazySession.get().update( entityName, object ); - } - @Override public T merge(T object) { return this.lazySession.get().merge( object ); diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/AbstractFlushingEventListener.java b/hibernate-core/src/main/java/org/hibernate/event/internal/AbstractFlushingEventListener.java index 0ce8699e1f..e042e6c5ec 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/AbstractFlushingEventListener.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/AbstractFlushingEventListener.java @@ -198,13 +198,11 @@ public abstract class AbstractFlushingEventListener implements JpaBootstrapSensi } protected PersistContext getContext(EventSource session) { - return jpaBootstrap || isJpaCascadeComplianceEnabled( session ) ? PersistContext.create() : null; + return PersistContext.create(); } protected CascadingAction getCascadingAction(EventSource session) { - return jpaBootstrap || isJpaCascadeComplianceEnabled( session ) - ? CascadingActions.PERSIST_ON_FLUSH - : CascadingActions.SAVE_UPDATE; + return CascadingActions.PERSIST_ON_FLUSH; } private static boolean isJpaCascadeComplianceEnabled(EventSource session) { diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultSaveEventListener.java b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultSaveEventListener.java deleted file mode 100644 index 24fa5f4d43..0000000000 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultSaveEventListener.java +++ /dev/null @@ -1,45 +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 . - */ -package org.hibernate.event.internal; - -import org.hibernate.Hibernate; -import org.hibernate.PersistentObjectException; -import org.hibernate.engine.spi.EntityEntry; -import org.hibernate.engine.spi.SessionImplementor; -import org.hibernate.engine.spi.Status; -import org.hibernate.event.spi.SaveOrUpdateEvent; - -/** - * An event handler for save() events - * - * @author Gavin King - * - * @deprecated since {@link org.hibernate.Session#save} is deprecated - */ -@Deprecated(since="6") -public class DefaultSaveEventListener extends DefaultSaveOrUpdateEventListener { - - @Override - protected Object performSaveOrUpdate(SaveOrUpdateEvent event) { - // this implementation is supposed to tolerate incorrect unsaved-value - // mappings, for the purpose of backward-compatibility - final EntityEntry entry = event.getSession().getPersistenceContextInternal().getEntry( event.getEntity() ); - return entry != null && entry.getStatus() != Status.DELETED - ? entityIsPersistent( event ) - : entityIsTransient( event ); - } - - @Override - protected boolean reassociateIfUninitializedProxy(Object object, SessionImplementor source) { - if ( !Hibernate.isInitialized( object ) ) { - throw new PersistentObjectException("uninitialized proxy passed to save()"); - } - else { - return false; - } - } -} diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultSaveOrUpdateEventListener.java b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultSaveOrUpdateEventListener.java deleted file mode 100644 index f62877b58c..0000000000 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultSaveOrUpdateEventListener.java +++ /dev/null @@ -1,340 +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 . - */ -package org.hibernate.event.internal; - -import org.hibernate.AssertionFailure; -import org.hibernate.HibernateException; -import org.hibernate.LockMode; -import org.hibernate.PersistentObjectException; -import org.hibernate.TransientObjectException; -import org.hibernate.classic.Lifecycle; -import org.hibernate.engine.internal.Cascade; -import org.hibernate.engine.internal.CascadePoint; -import org.hibernate.engine.spi.CascadingAction; -import org.hibernate.engine.spi.CascadingActions; -import org.hibernate.engine.spi.EntityEntry; -import org.hibernate.engine.spi.EntityKey; -import org.hibernate.engine.spi.PersistenceContext; -import org.hibernate.engine.spi.SessionFactoryImplementor; -import org.hibernate.engine.spi.SessionImplementor; -import org.hibernate.engine.spi.Status; -import org.hibernate.event.spi.EventSource; -import org.hibernate.event.spi.PersistContext; -import org.hibernate.event.spi.SaveOrUpdateEvent; -import org.hibernate.event.spi.SaveOrUpdateEventListener; -import org.hibernate.internal.CoreLogging; -import org.hibernate.internal.CoreMessageLogger; -import org.hibernate.persister.entity.EntityPersister; -import org.hibernate.pretty.MessageHelper; -import org.hibernate.proxy.HibernateProxy; -import org.hibernate.proxy.LazyInitializer; - -/** - * Defines the default listener used by Hibernate for handling save-update - * events. - * - * @author Steve Ebersole - * @author Gavin King - * - * @deprecated since {@link org.hibernate.Session#saveOrUpdate} is deprecated - */ -@Deprecated(since="6") -public class DefaultSaveOrUpdateEventListener - extends AbstractSaveEventListener - implements SaveOrUpdateEventListener { - private static final CoreMessageLogger LOG = CoreLogging.messageLogger( DefaultSaveOrUpdateEventListener.class ); - - /** - * Handle the given update event. - * - * @param event The update event to be handled. - */ - @Override - public void onSaveOrUpdate(SaveOrUpdateEvent event) { - final Object object = event.getObject(); - final Object requestedId = event.getRequestedId(); - - if ( requestedId != null ) { - //assign the requested id to the proxy, *before* - //reassociating the proxy - final LazyInitializer lazyInitializer = HibernateProxy.extractLazyInitializer( object ); - if ( lazyInitializer != null ) { - lazyInitializer.setIdentifier( requestedId ); - } - } - - final SessionImplementor source = event.getSession(); - // For an uninitialized proxy, noop, don't even need to return an id, since it is never a save() - if ( reassociateIfUninitializedProxy( object, source ) ) { - LOG.trace( "Reassociated uninitialized proxy" ); - } - else { - //initialize properties of the event: - final PersistenceContext persistenceContext = source.getPersistenceContextInternal(); - final Object entity = persistenceContext.unproxyAndReassociate( object ); - event.setEntity( entity ); - event.setEntry( persistenceContext.getEntry( entity ) ); - //return the id in the event object - event.setResultId( performSaveOrUpdate( event ) ); - } - } - - protected boolean reassociateIfUninitializedProxy(Object object, SessionImplementor source) { - return source.getPersistenceContextInternal().reassociateIfUninitializedProxy( object ); - } - - protected Object performSaveOrUpdate(SaveOrUpdateEvent event) { - final EntityState entityState = EntityState.getEntityState( - event.getEntity(), - event.getEntityName(), - event.getEntry(), - event.getSession(), - null - ); - - switch ( entityState ) { - case DETACHED: - entityIsDetached( event ); - return null; - case PERSISTENT: - return entityIsPersistent( event ); - default: //TRANSIENT or DELETED - return entityIsTransient( event ); - } - } - - protected Object entityIsPersistent(SaveOrUpdateEvent event) throws HibernateException { - if ( LOG.isTraceEnabled() ) { - LOG.trace( "Ignoring persistent instance" ); - } - EntityEntry entityEntry = event.getEntry(); - if ( entityEntry == null ) { - throw new AssertionFailure( "entity was transient or detached" ); - } - else { - - if ( entityEntry.getStatus() == Status.DELETED ) { - throw new AssertionFailure( "entity was deleted" ); - } - - final SessionFactoryImplementor factory = event.getFactory(); - - final Object requestedId = event.getRequestedId(); - final Object savedId; - if ( requestedId == null ) { - savedId = entityEntry.getId(); - } - else { - final boolean isEqual = entityEntry.getPersister().getIdentifierType() - .isEqual( requestedId, entityEntry.getId(), factory ); - if ( isEqual ) { - throw new PersistentObjectException( - "object passed to save() was already persistent: " + - MessageHelper.infoString( entityEntry.getPersister(), requestedId, factory ) - ); - } - savedId = requestedId; - } - - if ( LOG.isTraceEnabled() ) { - LOG.tracev( - "Object already associated with session: {0}", - MessageHelper.infoString( entityEntry.getPersister(), savedId, factory ) - ); - } - - return savedId; - - } - } - - /** - * The given save-update event named a transient entity. - *

- * Here, we will perform the save processing. - * - * @param event The save event to be handled. - * - * @return The entity's identifier after saving. - */ - protected Object entityIsTransient(SaveOrUpdateEvent event) { - - LOG.trace( "Saving transient instance" ); - - final EventSource source = event.getSession(); - - final EntityEntry entityEntry = event.getEntry(); - if ( entityEntry != null ) { - if ( entityEntry.getStatus() == Status.DELETED ) { - source.forceFlush( entityEntry ); - } - else { - throw new AssertionFailure( "entity was persistent" ); - } - } - - if ( event.getRequestedId() != null ) { - throw new AssertionFailure( "requested id should be null in save" ); - } - final Object id = saveWithGeneratedId( - event.getEntity(), - event.getEntityName(), - null, - event.getSession(), - true - ); - - source.getPersistenceContextInternal().reassociateProxy( event.getObject(), id ); - - return id; - } - - /** - * The given save-update event named a detached entity. - *

- * Here, we will perform the update processing. - * - * @param event The update event to be handled. - */ - protected void entityIsDetached(SaveOrUpdateEvent event) { - LOG.trace( "Updating detached instance" ); - - final EventSource session = event.getSession(); - if ( session.getPersistenceContextInternal().isEntryFor( event.getEntity() ) ) { - //TODO: assertion only, could be optimized away - throw new AssertionFailure( "entity was persistent" ); - } - - final Object entity = event.getEntity(); - final EntityPersister persister = session.getEntityPersister( event.getEntityName(), entity ); - event.setRequestedId( getUpdateId( entity, persister, event.getRequestedId(), session ) ); - performUpdate( event, entity, persister ); - } - - /** - * Determine the id to use for updating. - * - * @param entity The entity. - * @param persister The entity persister - * @param requestedId The requested identifier - * @param session The session - * - * @return The id. - * - * @throws TransientObjectException If the entity is considered transient. - */ - protected Object getUpdateId(Object entity, EntityPersister persister, Object requestedId, SessionImplementor session) { - // use the id assigned to the instance - final Object id = persister.getIdentifier( entity, session ); - if ( id == null ) { - // assume this is a newly instantiated transient object - // which should be saved rather than updated - throw new TransientObjectException( "The given object has a null identifier: " - + persister.getEntityName() ); - } - else { - return id; - } - } - - protected void performUpdate(SaveOrUpdateEvent event, Object entity, EntityPersister persister) - throws HibernateException { - final EventSource source = event.getSession(); - - if ( LOG.isTraceEnabled() ) { - if ( !persister.isMutable() ) { - LOG.trace( "Immutable instance passed to performUpdate()" ); - } - LOG.tracev( - "Updating {0}", - MessageHelper.infoString( persister, event.getRequestedId(), event.getFactory() ) - ); - } - - final PersistenceContext persistenceContext = source.getPersistenceContextInternal(); - final EntityKey key = source.generateEntityKey( event.getRequestedId(), persister ); - persistenceContext.checkUniqueness( key, entity ); - - if ( invokeUpdateLifecycle( entity, persister, source ) ) { - reassociate( event, event.getObject(), event.getRequestedId(), persister ); - } - else { - // this is a transient object with existing persistent state not loaded by the session - new OnUpdateVisitor( source, event.getRequestedId(), entity ).process( entity, persister ); - - // TODO: put this stuff back in to read snapshot from - // the second-level cache (needs some extra work) -// Object[] cachedState = null; -// if ( persister.hasCache() ) { -// CacheEntry entry = (CacheEntry) persister.getCache() -// .get( event.getRequestedId(), source.getTimestamp() ); -// cachedState = entry==null ? -// null : -// entry.getState(); //TODO: half-assemble this stuff -// } - - persistenceContext.addEntity( - entity, - persister.isMutable() ? Status.MANAGED : Status.READ_ONLY, - null, // cachedState, - key, - persister.getVersion( entity ), - LockMode.NONE, - true, - persister, - false - ); - - persister.afterReassociate( entity, source ); - - if ( LOG.isTraceEnabled() ) { - LOG.tracev( - "Updating {0}", - MessageHelper.infoString( persister, event.getRequestedId(), event.getFactory() ) - ); - } - - cascadeOnUpdate( event, persister, entity ); - } - } - - protected boolean invokeUpdateLifecycle(Object entity, EntityPersister persister, EventSource source) { - if ( persister.implementsLifecycle() ) { - LOG.debug( "Calling onUpdate()" ); - if ( ( (Lifecycle) entity ).onUpdate( source ) ) { - LOG.debug( "Update vetoed by onUpdate()" ); - return true; - } - } - return false; - } - - /** - * Handles the calls needed to perform cascades as part of an update request - * for the given entity. - * - * @param event The event currently being processed. - * @param persister The defined persister for the entity being updated. - * @param entity The entity being updated. - */ - private void cascadeOnUpdate(SaveOrUpdateEvent event, EntityPersister persister, Object entity) { - final EventSource source = event.getSession(); - final PersistenceContext persistenceContext = source.getPersistenceContextInternal(); - persistenceContext.incrementCascadeLevel(); - try { - Cascade.cascade( CascadingActions.SAVE_UPDATE, CascadePoint.AFTER_UPDATE, source, persister, entity ); - } - finally { - persistenceContext.decrementCascadeLevel(); - } - } - - @Override - protected CascadingAction getCascadeAction() { - return CascadingActions.SAVE_UPDATE; - } -} diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultUpdateEventListener.java b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultUpdateEventListener.java deleted file mode 100644 index 572ebfd26a..0000000000 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultUpdateEventListener.java +++ /dev/null @@ -1,62 +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 . - */ -package org.hibernate.event.internal; - -import org.hibernate.HibernateException; -import org.hibernate.ObjectDeletedException; -import org.hibernate.engine.spi.EntityEntry; -import org.hibernate.engine.spi.SessionImplementor; -import org.hibernate.engine.spi.Status; -import org.hibernate.event.spi.SaveOrUpdateEvent; -import org.hibernate.persister.entity.EntityPersister; - -/** - * An event handler for update() events - * - * @author Gavin King - * - * @deprecated since {@link org.hibernate.Session#update} is deprecated - */ -@Deprecated(since="6") -public class DefaultUpdateEventListener extends DefaultSaveOrUpdateEventListener { - - @Override - protected Object performSaveOrUpdate(SaveOrUpdateEvent event) { - // this implementation is supposed to tolerate incorrect unsaved-value - // mappings, for the purpose of backward-compatibility - EntityEntry entry = event.getSession().getPersistenceContextInternal().getEntry( event.getEntity() ); - if ( entry!=null ) { - if ( entry.getStatus() == Status.DELETED ) { - throw new ObjectDeletedException( "deleted instance passed to update()", null, event.getEntityName() ); - } - else { - return entityIsPersistent( event ); - } - } - else { - entityIsDetached( event ); - return null; - } - } - - /** - * If the user specified an id, assign it to the instance and use that, - * otherwise use the id already assigned to the instance - */ - @Override - protected Object getUpdateId(Object entity, EntityPersister persister, Object requestedId, SessionImplementor session) - throws HibernateException { - if ( requestedId == null ) { - return super.getUpdateId( entity, persister, null, session ); - } - else { - persister.setIdentifier( entity, requestedId, session ); - return requestedId; - } - } - -} diff --git a/hibernate-core/src/main/java/org/hibernate/event/service/internal/EventListenerRegistryImpl.java b/hibernate-core/src/main/java/org/hibernate/event/service/internal/EventListenerRegistryImpl.java index b86843781f..baca145a23 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/service/internal/EventListenerRegistryImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/event/service/internal/EventListenerRegistryImpl.java @@ -32,9 +32,6 @@ import org.hibernate.event.internal.DefaultPreLoadEventListener; import org.hibernate.event.internal.DefaultRefreshEventListener; import org.hibernate.event.internal.DefaultReplicateEventListener; import org.hibernate.event.internal.DefaultResolveNaturalIdEventListener; -import org.hibernate.event.internal.DefaultSaveEventListener; -import org.hibernate.event.internal.DefaultSaveOrUpdateEventListener; -import org.hibernate.event.internal.DefaultUpdateEventListener; import org.hibernate.event.internal.PostDeleteEventListenerStandardImpl; import org.hibernate.event.internal.PostInsertEventListenerStandardImpl; import org.hibernate.event.internal.PostUpdateEventListenerStandardImpl; @@ -81,9 +78,6 @@ import static org.hibernate.event.spi.EventType.PRE_UPSERT; import static org.hibernate.event.spi.EventType.REFRESH; import static org.hibernate.event.spi.EventType.REPLICATE; import static org.hibernate.event.spi.EventType.RESOLVE_NATURAL_ID; -import static org.hibernate.event.spi.EventType.SAVE; -import static org.hibernate.event.spi.EventType.SAVE_UPDATE; -import static org.hibernate.event.spi.EventType.UPDATE; /** * Standard implementation of EventListenerRegistry @@ -317,20 +311,11 @@ public class EventListenerRegistryImpl implements EventListenerRegistry { // post-upsert listeners prepareListeners( POST_UPSERT, new PostUpsertEventListenerStandardImpl() ); - // update listeners - prepareListeners( UPDATE, new DefaultUpdateEventListener() ); - // refresh listeners prepareListeners( REFRESH, new DefaultRefreshEventListener() ); // replicate listeners prepareListeners( REPLICATE, new DefaultReplicateEventListener() ); - - // save listeners - prepareListeners( SAVE, new DefaultSaveEventListener() ); - - // save-update listeners - prepareListeners( SAVE_UPDATE, new DefaultSaveOrUpdateEventListener() ); } public void prepareListeners(EventType eventType) { diff --git a/hibernate-core/src/main/java/org/hibernate/event/spi/EventType.java b/hibernate-core/src/main/java/org/hibernate/event/spi/EventType.java index 75e6b64d52..e071534c45 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/spi/EventType.java +++ b/hibernate-core/src/main/java/org/hibernate/event/spi/EventType.java @@ -31,9 +31,6 @@ public final class EventType { public static final EventType INIT_COLLECTION = create( "load-collection", InitializeCollectionEventListener.class ); - public static final EventType SAVE_UPDATE = create( "save-update", SaveOrUpdateEventListener.class ); - public static final EventType UPDATE = create( "update", SaveOrUpdateEventListener.class ); - public static final EventType SAVE = create( "save", SaveOrUpdateEventListener.class ); public static final EventType PERSIST = create( "create", PersistEventListener.class ); public static final EventType PERSIST_ONFLUSH = create( "create-onflush", PersistEventListener.class ); diff --git a/hibernate-core/src/main/java/org/hibernate/event/spi/SaveOrUpdateEventListener.java b/hibernate-core/src/main/java/org/hibernate/event/spi/SaveOrUpdateEventListener.java deleted file mode 100644 index 91c453fa63..0000000000 --- a/hibernate-core/src/main/java/org/hibernate/event/spi/SaveOrUpdateEventListener.java +++ /dev/null @@ -1,28 +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 . - */ -package org.hibernate.event.spi; - -import org.hibernate.HibernateException; - -/** - * Defines the contract for handling of update events generated from a session. - * - * @author Steve Ebersole - * - * @deprecated since {@link org.hibernate.Session#saveOrUpdate} and friends are deprecated - */ -@Deprecated(since="6") -public interface SaveOrUpdateEventListener { - - /** - * Handle the given update event. - * - * @param event The update event to be handled. - */ - void onSaveOrUpdate(SaveOrUpdateEvent event) throws HibernateException; - -} diff --git a/hibernate-core/src/main/java/org/hibernate/id/IdentifierGeneratorHelper.java b/hibernate-core/src/main/java/org/hibernate/id/IdentifierGeneratorHelper.java index f4ab6af5ed..b51fb1af40 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/IdentifierGeneratorHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/id/IdentifierGeneratorHelper.java @@ -159,7 +159,8 @@ public final class IdentifierGeneratorHelper { } catch (TransientObjectException toe) { if ( sessionImplementor.isSessionImplementor() ) { - return sessionImplementor.asSessionImplementor().save( associatedEntityName, associatedEntity ); + sessionImplementor.asSessionImplementor().persist( associatedEntityName, associatedEntity ); + return sessionImplementor.getContextEntityIdentifier( associatedEntity ); } else if ( sessionImplementor.isStatelessSession() ) { return sessionImplementor.asStatelessSession().insert( associatedEntityName, associatedEntity ); diff --git a/hibernate-core/src/main/java/org/hibernate/internal/FastSessionServices.java b/hibernate-core/src/main/java/org/hibernate/internal/FastSessionServices.java index fb60ca74f0..de821078d6 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/FastSessionServices.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/FastSessionServices.java @@ -63,7 +63,6 @@ import org.hibernate.event.spi.PreUpsertEventListener; import org.hibernate.event.spi.RefreshEventListener; import org.hibernate.event.spi.ReplicateEventListener; import org.hibernate.event.spi.ResolveNaturalIdEventListener; -import org.hibernate.event.spi.SaveOrUpdateEventListener; import org.hibernate.jpa.HibernateHints; import org.hibernate.jpa.LegacySpecHints; import org.hibernate.jpa.SpecHints; @@ -154,9 +153,6 @@ public final class FastSessionServices { public final EventListenerGroup eventListenerGroup_REFRESH; public final EventListenerGroup eventListenerGroup_REPLICATE; public final EventListenerGroup eventListenerGroup_RESOLVE_NATURAL_ID; - public final EventListenerGroup eventListenerGroup_SAVE; - public final EventListenerGroup eventListenerGroup_SAVE_UPDATE; - public final EventListenerGroup eventListenerGroup_UPDATE; //Intentionally Package private: final boolean disallowOutOfTransactionUpdateOperations; @@ -236,9 +232,6 @@ public final class FastSessionServices { this.eventListenerGroup_REFRESH = listeners( eventListenerRegistry, EventType.REFRESH ); this.eventListenerGroup_REPLICATE = listeners( eventListenerRegistry, EventType.REPLICATE ); this.eventListenerGroup_RESOLVE_NATURAL_ID = listeners( eventListenerRegistry, EventType.RESOLVE_NATURAL_ID ); - this.eventListenerGroup_SAVE = listeners( eventListenerRegistry, EventType.SAVE ); - this.eventListenerGroup_SAVE_UPDATE = listeners( eventListenerRegistry, EventType.SAVE_UPDATE ); - this.eventListenerGroup_UPDATE = listeners( eventListenerRegistry, EventType.UPDATE ); //Other highly useful constants: this.dialect = jdbcServices.getJdbcEnvironment().getDialect(); diff --git a/hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java b/hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java index c495b3a7cc..28f25da657 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java @@ -107,8 +107,6 @@ import org.hibernate.event.spi.ReplicateEvent; import org.hibernate.event.spi.ReplicateEventListener; import org.hibernate.event.spi.ResolveNaturalIdEvent; import org.hibernate.event.spi.ResolveNaturalIdEventListener; -import org.hibernate.event.spi.SaveOrUpdateEvent; -import org.hibernate.event.spi.SaveOrUpdateEventListener; import org.hibernate.graph.GraphSemantic; import org.hibernate.graph.RootGraph; import org.hibernate.graph.spi.RootGraphImplementor; @@ -637,72 +635,6 @@ public class SessionImpl super.checkOpenOrWaitingForAutoClose(); } - // saveOrUpdate() operations ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - @Override @Deprecated - public void saveOrUpdate(Object object) throws HibernateException { - saveOrUpdate( null, object ); - } - - @Override @Deprecated - public void saveOrUpdate(String entityName, Object obj) throws HibernateException { - fireSaveOrUpdate( new SaveOrUpdateEvent( entityName, obj, this ) ); - } - - private void fireSaveOrUpdate(final SaveOrUpdateEvent event) { - checkOpen(); - checkTransactionSynchStatus(); - checkNoUnresolvedActionsBeforeOperation(); - fastSessionServices.eventListenerGroup_SAVE_UPDATE - .fireEventOnEachListener( event, SaveOrUpdateEventListener::onSaveOrUpdate ); - checkNoUnresolvedActionsAfterOperation(); - } - - // save() operations ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - @Override @Deprecated - public Object save(Object obj) throws HibernateException { - return save( null, obj ); - } - - @Override @Deprecated - public Object save(String entityName, Object object) throws HibernateException { - return fireSave( new SaveOrUpdateEvent( entityName, object, this ) ); - } - - private Object fireSave(final SaveOrUpdateEvent event) { - checkOpen(); - checkTransactionSynchStatus(); - checkNoUnresolvedActionsBeforeOperation(); - fastSessionServices.eventListenerGroup_SAVE - .fireEventOnEachListener( event, SaveOrUpdateEventListener::onSaveOrUpdate ); - checkNoUnresolvedActionsAfterOperation(); - return event.getResultId(); - } - - - // update() operations ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - @Override @Deprecated - public void update(Object obj) throws HibernateException { - update( null, obj ); - } - - @Override @Deprecated - public void update(String entityName, Object object) throws HibernateException { - fireUpdate( new SaveOrUpdateEvent( entityName, object, this ) ); - } - - private void fireUpdate(SaveOrUpdateEvent event) { - checkOpen(); - checkTransactionSynchStatus(); - checkNoUnresolvedActionsBeforeOperation(); - fastSessionServices.eventListenerGroup_UPDATE - .fireEventOnEachListener( event, SaveOrUpdateEventListener::onSaveOrUpdate ); - checkNoUnresolvedActionsAfterOperation(); - } - - // lock() operations ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @Override diff --git a/hibernate-envers/src/main/java/org/hibernate/envers/internal/revisioninfo/DefaultRevisionInfoGenerator.java b/hibernate-envers/src/main/java/org/hibernate/envers/internal/revisioninfo/DefaultRevisionInfoGenerator.java index 8485084c7d..9d4dee136e 100644 --- a/hibernate-envers/src/main/java/org/hibernate/envers/internal/revisioninfo/DefaultRevisionInfoGenerator.java +++ b/hibernate-envers/src/main/java/org/hibernate/envers/internal/revisioninfo/DefaultRevisionInfoGenerator.java @@ -59,7 +59,7 @@ public class DefaultRevisionInfoGenerator implements RevisionInfoGenerator { @Override public void saveRevisionData(Session session, Object revisionData) { - session.save( revisionInfoEntityName, revisionData ); + session.persist( revisionInfoEntityName, revisionData ); if ( revisionInfoNumberReader != null && revisionInfoNumberReader.getRevisionNumber( revisionData ).longValue() < 0 ) { throw new AuditException( "Negative revision numbers are not allowed" ); } diff --git a/hibernate-envers/src/main/java/org/hibernate/envers/strategy/internal/DefaultAuditStrategy.java b/hibernate-envers/src/main/java/org/hibernate/envers/strategy/internal/DefaultAuditStrategy.java index 843956f956..40efb49984 100644 --- a/hibernate-envers/src/main/java/org/hibernate/envers/strategy/internal/DefaultAuditStrategy.java +++ b/hibernate-envers/src/main/java/org/hibernate/envers/strategy/internal/DefaultAuditStrategy.java @@ -43,7 +43,7 @@ public class DefaultAuditStrategy implements AuditStrategy { Object id, Object data, Object revision) { - session.save( configuration.getAuditEntityName( entityName ), data ); + session.persist( configuration.getAuditEntityName( entityName ), data ); sessionCacheCleaner.scheduleAuditDataRemoval( session, data ); } @@ -55,7 +55,7 @@ public class DefaultAuditStrategy implements AuditStrategy { Configuration configuration, PersistentCollectionChangeData persistentCollectionChangeData, Object revision) { - session.save( persistentCollectionChangeData.getEntityName(), persistentCollectionChangeData.getData() ); + session.persist( persistentCollectionChangeData.getEntityName(), persistentCollectionChangeData.getData() ); sessionCacheCleaner.scheduleAuditDataRemoval( session, persistentCollectionChangeData.getData() ); } diff --git a/hibernate-envers/src/main/java/org/hibernate/envers/strategy/internal/ValidityAuditStrategy.java b/hibernate-envers/src/main/java/org/hibernate/envers/strategy/internal/ValidityAuditStrategy.java index 67afed64ee..0e56f8fc94 100644 --- a/hibernate-envers/src/main/java/org/hibernate/envers/strategy/internal/ValidityAuditStrategy.java +++ b/hibernate-envers/src/main/java/org/hibernate/envers/strategy/internal/ValidityAuditStrategy.java @@ -163,7 +163,7 @@ public class ValidityAuditStrategy implements AuditStrategy { final String auditedEntityName = configuration.getAuditEntityName( entityName ); // Save the audit data - session.save( auditedEntityName, data ); + session.persist( auditedEntityName, data ); // Update the end date of the previous row. // @@ -271,7 +271,7 @@ public class ValidityAuditStrategy implements AuditStrategy { } // Save the audit data - session.save( persistentCollectionChangeData.getEntityName(), persistentCollectionChangeData.getData() ); + session.persist( persistentCollectionChangeData.getEntityName(), persistentCollectionChangeData.getData() ); sessionCacheCleaner.scheduleAuditDataRemoval( session, persistentCollectionChangeData.getData() ); } @@ -375,7 +375,7 @@ public class ValidityAuditStrategy implements AuditStrategy { } // Saving the previous version - session.save( auditedEntityName, previousData ); + session.persist( auditedEntityName, previousData ); sessionCacheCleaner.scheduleAuditDataRemoval( session, previousData ); } else { diff --git a/hibernate-graalvm/src/main/java/org/hibernate/graalvm/internal/StaticClassLists.java b/hibernate-graalvm/src/main/java/org/hibernate/graalvm/internal/StaticClassLists.java index f7ce9ef39d..60e22aebb0 100644 --- a/hibernate-graalvm/src/main/java/org/hibernate/graalvm/internal/StaticClassLists.java +++ b/hibernate-graalvm/src/main/java/org/hibernate/graalvm/internal/StaticClassLists.java @@ -68,7 +68,6 @@ final class StaticClassLists { org.hibernate.event.spi.LoadEventListener[].class, org.hibernate.event.spi.ResolveNaturalIdEventListener[].class, org.hibernate.event.spi.InitializeCollectionEventListener[].class, - org.hibernate.event.spi.SaveOrUpdateEventListener[].class, org.hibernate.event.spi.PersistEventListener[].class, org.hibernate.event.spi.MergeEventListener[].class, org.hibernate.event.spi.DeleteEventListener[].class,