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,