Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
import org.hibernate.collection.spi.PersistentCollection;
import org.hibernate.engine.internal.Cascade;
import org.hibernate.engine.internal.CascadePoint;
import org.hibernate.engine.jdbc.spi.JdbcCoordinator;
import org.hibernate.engine.spi.ActionQueue;
import org.hibernate.engine.spi.CascadingActions;
import org.hibernate.engine.spi.CollectionEntry;
Expand All @@ -24,7 +23,6 @@
import org.hibernate.engine.spi.PersistenceContext;
import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.engine.spi.Status;
import org.hibernate.event.service.spi.EventListenerGroup;
import org.hibernate.event.spi.EventSource;
import org.hibernate.event.spi.FlushEntityEvent;
import org.hibernate.event.spi.FlushEntityEventListener;
Expand Down Expand Up @@ -63,8 +61,8 @@ public abstract class AbstractFlushingEventListener {
*/
protected void flushEverythingToExecutions(FlushEvent event) throws HibernateException {
LOG.trace( "Flushing session" );
final EventSource session = event.getSession();
final PersistenceContext persistenceContext = session.getPersistenceContextInternal();
final var session = event.getSession();
final var persistenceContext = session.getPersistenceContextInternal();
preFlush( session, persistenceContext );
flushEverythingToExecutions( event, persistenceContext, session );
}
Expand Down Expand Up @@ -98,9 +96,9 @@ protected void preFlush(EventSource session, PersistenceContext persistenceConte

protected void logFlushResults(FlushEvent event) {
if ( LOG.isDebugEnabled() ) {
final EventSource session = event.getSession();
final PersistenceContext persistenceContext = session.getPersistenceContextInternal();
final ActionQueue actionQueue = session.getActionQueue();
final var session = event.getSession();
final var persistenceContext = session.getPersistenceContextInternal();
final var actionQueue = session.getActionQueue();
LOG.debugf(
"Flushed: %s insertions, %s updates, %s deletions to %s objects",
actionQueue.numberOfInsertions(),
Expand Down Expand Up @@ -128,11 +126,11 @@ protected void logFlushResults(FlushEvent event) {
private void prepareEntityFlushes(EventSource session, PersistenceContext persistenceContext)
throws HibernateException {
LOG.trace( "Processing flush-time cascades" );
final PersistContext context = PersistContext.create();
final var context = PersistContext.create();
// safe from concurrent modification because of how concurrentEntries() is implemented on IdentityMap
for ( var me : persistenceContext.reentrantSafeEntityEntries() ) {
// for ( Map.Entry me : IdentityMap.concurrentEntries( persistenceContext.getEntityEntries() ) ) {
final EntityEntry entry = me.getValue();
final var entry = me.getValue();
if ( flushable( entry ) ) {
cascadeOnFlush( session, entry.getPersister(), me.getKey(), context );
}
Expand All @@ -146,7 +144,7 @@ void checkForTransientReferences(EventSource session, PersistenceContext persist
// persistent when we do the check (I wonder if we could move this
// into Nullability, instead of abusing the Cascade infrastructure)
for ( var me : persistenceContext.reentrantSafeEntityEntries() ) {
final EntityEntry entry = me.getValue();
final var entry = me.getValue();
if ( checkable( entry ) ) {
Cascade.cascade(
CascadingActions.CHECK_ON_FLUSH,
Expand Down Expand Up @@ -175,7 +173,7 @@ private static boolean checkable(EntityEntry entry) {

private void cascadeOnFlush(EventSource session, EntityPersister persister, Object object, PersistContext anything)
throws HibernateException {
final PersistenceContext persistenceContext = session.getPersistenceContextInternal();
final var persistenceContext = session.getPersistenceContextInternal();
persistenceContext.incrementCascadeLevel();
try {
Cascade.cascade( CascadingActions.PERSIST_ON_FLUSH, CascadePoint.BEFORE_FLUSH, session, persister, object, anything );
Expand All @@ -194,7 +192,9 @@ private void prepareCollectionFlushes(PersistenceContext persistenceContext) thr
LOG.trace( "Dirty checking collections" );
final var collectionEntries = persistenceContext.getCollectionEntries();
if ( collectionEntries != null ) {
final var identityMap = (InstanceIdentityMap<PersistentCollection<?>, CollectionEntry>) collectionEntries;
final var identityMap =
(InstanceIdentityMap<PersistentCollection<?>, CollectionEntry>)
collectionEntries;
for ( var entry : identityMap.toArray() ) {
entry.getValue().preFlush( entry.getKey() );
}
Expand All @@ -212,8 +212,8 @@ private int flushEntities(final FlushEvent event, final PersistenceContext persi
throws HibernateException {
LOG.trace( "Flushing entities and processing referenced collections" );

final EventSource source = event.getSession();
final EventListenerGroup<FlushEntityEventListener> flushListeners =
final var source = event.getSession();
final var flushListeners =
event.getFactory().getEventListenerGroups().eventListenerGroup_FLUSH_ENTITY;

// Among other things, updateReachables() recursively loads all
Expand All @@ -227,7 +227,7 @@ private int flushEntities(final FlushEvent event, final PersistenceContext persi
int eventGenerationId = 0; //Used to double-check the instance reuse won't cause problems
for ( var me : entityEntries ) {
// Update the status of the object and if necessary, schedule an update
final EntityEntry entry = me.getValue();
final var entry = me.getValue();
final Status status = entry.getStatus();
if ( status != Status.LOADING && status != Status.GONE ) {
entityEvent = createOrReuseEventInstance( entityEvent, source, me.getKey(), entry );
Expand Down Expand Up @@ -276,9 +276,11 @@ private int flushCollections(final EventSource session, final PersistenceContext
}
else {
count = collectionEntries.size();
final var identityMap = (InstanceIdentityMap<PersistentCollection<?>, CollectionEntry>) collectionEntries;
final var identityMap =
(InstanceIdentityMap<PersistentCollection<?>, CollectionEntry>)
collectionEntries;
for ( var me : identityMap.toArray() ) {
final CollectionEntry ce = me.getValue();
final var ce = me.getValue();
if ( !ce.isReached() && !ce.isIgnore() ) {
processUnreachableCollection( me.getKey(), session );
}
Expand All @@ -288,8 +290,8 @@ private int flushCollections(final EventSource session, final PersistenceContext
// Schedule updates to collections:

LOG.trace( "Scheduling collection removes/(re)creates/updates" );
final ActionQueue actionQueue = session.getActionQueue();
final Interceptor interceptor = session.getInterceptor();
final var actionQueue = session.getActionQueue();
final var interceptor = session.getInterceptor();
persistenceContext.forEachCollectionEntry(
(coll, ce) -> {
if ( ce.isDorecreate() ) {
Expand Down Expand Up @@ -366,8 +368,8 @@ protected void performExecutions(EventSource session) {
// during-flush callbacks more leniency in regards to initializing proxies and
// lazy collections during their processing.
// For more information, see HHH-2763
final PersistenceContext persistenceContext = session.getPersistenceContextInternal();
final JdbcCoordinator jdbcCoordinator = session.getJdbcCoordinator();
final var persistenceContext = session.getPersistenceContextInternal();
final var jdbcCoordinator = session.getJdbcCoordinator();
try {
jdbcCoordinator.flushBeginning();
persistenceContext.setFlushing( true );
Expand Down Expand Up @@ -398,7 +400,7 @@ protected void performExecutions(EventSource session) {
protected void postFlush(SessionImplementor session) throws HibernateException {
LOG.trace( "Post flush" );

final PersistenceContext persistenceContext = session.getPersistenceContextInternal();
final var persistenceContext = session.getPersistenceContextInternal();
persistenceContext.clearCollectionsByKey();

// the database has changed now, so the subselect results need to be invalidated
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,8 @@
import org.hibernate.engine.internal.Cascade;
import org.hibernate.engine.internal.CascadePoint;
import org.hibernate.engine.spi.CascadingAction;
import org.hibernate.engine.spi.EntityEntry;
import org.hibernate.engine.spi.EntityEntryExtraState;
import org.hibernate.engine.spi.EntityKey;
import org.hibernate.engine.spi.PersistenceContext;
import org.hibernate.engine.spi.SelfDirtinessTracker;
import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.engine.spi.Status;
Expand Down Expand Up @@ -101,8 +99,8 @@ protected Object saveWithGeneratedId(
C context,
EventSource source,
boolean requiresImmediateIdAccess) {
final EntityPersister persister = source.getEntityPersister( entityName, entity );
final Generator generator = persister.getGenerator();
final var persister = source.getEntityPersister( entityName, entity );
final var generator = persister.getGenerator();
final boolean generatedOnExecution = generator.generatedOnExecution( entity, source );
final boolean generatedBeforeExecution = generator.generatedBeforeExecution( entity, source );
final Object generatedId;
Expand Down Expand Up @@ -216,13 +214,13 @@ protected Object performSave(
LOG.trace( "Persisting " + infoString( persister, id, source.getFactory() ) );
}

final EntityKey key = useIdentityColumn ? null : entityKey( id, persister, source );
final var key = useIdentityColumn ? null : entityKey( id, persister, source );
return performSaveOrReplicate( entity, key, persister, useIdentityColumn, context, source, delayIdentityInserts );
}

private static EntityKey entityKey(Object id, EntityPersister persister, EventSource source) {
final EntityKey key = source.generateEntityKey( id, persister );
final PersistenceContext persistenceContext = source.getPersistenceContextInternal();
final var key = source.generateEntityKey( id, persister );
final var persistenceContext = source.getPersistenceContextInternal();
final Object old = persistenceContext.getEntity( key );
if ( old != null ) {
if ( persistenceContext.getEntry( old ).getStatus() == Status.DELETED ) {
Expand Down Expand Up @@ -264,12 +262,12 @@ protected Object performSaveOrReplicate(

final Object id = key == null ? null : key.getIdentifier();

final PersistenceContext persistenceContext = source.getPersistenceContextInternal();
final var persistenceContext = source.getPersistenceContextInternal();

// Put a placeholder in entries, so we don't recurse back and try to save() the
// same object again. QUESTION: should this be done before onSave() is called?
// likewise, should it be done before onUpdate()?
final EntityEntry original = persistenceContext.addEntry(
final var original = persistenceContext.addEntry(
entity,
Status.SAVING,
null,
Expand All @@ -287,7 +285,7 @@ protected Object performSaveOrReplicate(

cascadeBeforeSave( source, persister, entity, context );

final AbstractEntityInsertAction insert = addInsertAction(
final var insert = addInsertAction(
cloneAndSubstituteValues( entity, persister, context, source, id ),
id,
entity,
Expand All @@ -303,9 +301,9 @@ protected Object performSaveOrReplicate(

final Object finalId = handleGeneratedId( useIdentityColumn, id, insert );

final EntityEntry newEntry = persistenceContext.getEntry( entity );
final var newEntry = persistenceContext.getEntry( entity );
if ( newEntry != original ) {
final EntityEntryExtraState extraState = newEntry.getExtraState( EntityEntryExtraState.class );
final var extraState = newEntry.getExtraState( EntityEntryExtraState.class );
if ( extraState == null ) {
newEntry.addExtraState( original.getExtraState( EntityEntryExtraState.class ) );
}
Expand Down Expand Up @@ -365,7 +363,7 @@ private AbstractEntityInsertAction addInsertAction(
EventSource source,
boolean delayIdentityInserts) {
if ( useIdentityColumn ) {
final EntityIdentityInsertAction insert = new EntityIdentityInsertAction(
final var insert = new EntityIdentityInsertAction(
values,
entity,
persister,
Expand All @@ -377,7 +375,7 @@ private AbstractEntityInsertAction addInsertAction(
return insert;
}
else {
final EntityInsertAction insert = new EntityInsertAction(
final var insert = new EntityInsertAction(
id,
values,
entity,
Expand Down Expand Up @@ -412,7 +410,7 @@ protected boolean visitCollectionsBeforeSave(
Object[] values,
Type[] types,
EventSource source) {
final WrapVisitor visitor = new WrapVisitor( entity, id, source );
final var visitor = new WrapVisitor( entity, id, source );
// substitutes into values by side effect
visitor.processEntityPropertyValues( values, types );
return visitor.isSubstitutionRequired();
Expand Down Expand Up @@ -466,7 +464,7 @@ protected void cascadeBeforeSave(
Object entity,
C context) {
// cascade-save to many-to-one BEFORE the parent is saved
final PersistenceContext persistenceContext = source.getPersistenceContextInternal();
final var persistenceContext = source.getPersistenceContextInternal();
persistenceContext.incrementCascadeLevel();
try {
Cascade.cascade(
Expand Down Expand Up @@ -497,7 +495,7 @@ protected void cascadeAfterSave(
Object entity,
C context) {
// cascade-save to collections AFTER the collection owner was saved
final PersistenceContext persistenceContext = source.getPersistenceContextInternal();
final var persistenceContext = source.getPersistenceContextInternal();
persistenceContext.incrementCascadeLevel();
try {
Cascade.cascade(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,10 @@

import org.hibernate.FlushMode;
import org.hibernate.HibernateException;
import org.hibernate.engine.spi.ActionQueue;
import org.hibernate.engine.spi.PersistenceContext;
import org.hibernate.engine.spi.SessionEventListenerManager;
import org.hibernate.event.spi.AutoFlushEvent;
import org.hibernate.event.spi.AutoFlushEventListener;
import org.hibernate.event.monitor.spi.EventMonitor;
import org.hibernate.event.monitor.spi.DiagnosticEvent;
import org.hibernate.event.spi.EventSource;
import org.hibernate.internal.CoreMessageLogger;
import org.hibernate.stat.spi.StatisticsImplementor;

import org.jboss.logging.Logger;

Expand All @@ -38,19 +32,19 @@ public class DefaultAutoFlushEventListener extends AbstractFlushingEventListener
*/
@Override
public void onAutoFlush(AutoFlushEvent event) throws HibernateException {
final EventSource source = event.getSession();
final SessionEventListenerManager eventListenerManager = source.getEventListenerManager();
final EventMonitor eventMonitor = source.getEventMonitor();
final DiagnosticEvent partialFlushEvent = eventMonitor.beginPartialFlushEvent();
final var source = event.getSession();
final var eventListenerManager = source.getEventListenerManager();
final var eventMonitor = source.getEventMonitor();
final var partialFlushEvent = eventMonitor.beginPartialFlushEvent();
try {
eventListenerManager.partialFlushStart();

if ( flushMightBeNeeded( source ) ) {
// Need to get the number of collection removals before flushing to executions
// (because flushing to executions can add collection removal actions to the action queue).
final ActionQueue actionQueue = source.getActionQueue();
final EventSource session = event.getSession();
final PersistenceContext persistenceContext = session.getPersistenceContextInternal();
final var actionQueue = source.getActionQueue();
final var session = event.getSession();
final var persistenceContext = session.getPersistenceContextInternal();
if ( !event.isSkipPreFlush() ) {
preFlush( session, persistenceContext );
}
Expand All @@ -62,17 +56,16 @@ public void onAutoFlush(AutoFlushEvent event) throws HibernateException {

// note: performExecutions() clears all collectionXxxxtion
// collections (the collection actions) in the session
final DiagnosticEvent flushEvent = eventMonitor.beginFlushEvent();
final var flushEvent = eventMonitor.beginFlushEvent();
try {
performExecutions( source );
postFlush( source );

postPostFlush( source );
}
finally {
eventMonitor.completeFlushEvent( flushEvent, event, true );
}
final StatisticsImplementor statistics = source.getFactory().getStatistics();
final var statistics = source.getFactory().getStatistics();
if ( statistics.isStatisticsEnabled() ) {
statistics.flush();
}
Expand All @@ -95,10 +88,10 @@ public void onAutoFlush(AutoFlushEvent event) throws HibernateException {

@Override
public void onAutoPreFlush(EventSource source) throws HibernateException {
final SessionEventListenerManager eventListenerManager = source.getEventListenerManager();
final var eventListenerManager = source.getEventListenerManager();
eventListenerManager.prePartialFlushStart();
final EventMonitor eventMonitor = source.getEventMonitor();
DiagnosticEvent diagnosticEvent = eventMonitor.beginPrePartialFlush();
final var eventMonitor = source.getEventMonitor();
final var diagnosticEvent = eventMonitor.beginPrePartialFlush();
try {
if ( flushMightBeNeeded( source ) ) {
preFlush( source, source.getPersistenceContextInternal() );
Expand All @@ -116,7 +109,7 @@ private boolean flushIsReallyNeeded(AutoFlushEvent event, final EventSource sour
}

private boolean flushMightBeNeeded(final EventSource source) {
final PersistenceContext persistenceContext = source.getPersistenceContextInternal();
final var persistenceContext = source.getPersistenceContextInternal();
return !source.getHibernateFlushMode().lessThan( FlushMode.AUTO )
&& ( persistenceContext.getNumberOfManagedEntities() > 0
|| persistenceContext.getCollectionEntriesSize() > 0 );
Expand Down
Loading