Skip to content

Commit 54ed8db

Browse files
committed
HHH-15848 suppress some exceptions when calling Session.isDirty()
code cleanups to EntityPrinter
1 parent 5bd3e6b commit 54ed8db

File tree

4 files changed

+83
-90
lines changed

4 files changed

+83
-90
lines changed

hibernate-core/src/main/java/org/hibernate/event/internal/AbstractFlushingEventListener.java

Lines changed: 27 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import org.hibernate.engine.internal.Collections;
2020
import org.hibernate.engine.jdbc.spi.JdbcCoordinator;
2121
import org.hibernate.engine.spi.ActionQueue;
22-
import org.hibernate.engine.spi.CascadingAction;
2322
import org.hibernate.engine.spi.CascadingActions;
2423
import org.hibernate.engine.spi.CollectionEntry;
2524
import org.hibernate.engine.spi.CollectionKey;
@@ -106,29 +105,27 @@ protected void preFlush(EventSource session, PersistenceContext persistenceConte
106105
}
107106

108107
protected void logFlushResults(FlushEvent event) {
109-
if ( !LOG.isDebugEnabled() ) {
110-
return;
108+
if ( LOG.isDebugEnabled() ) {
109+
final EventSource session = event.getSession();
110+
final PersistenceContext persistenceContext = session.getPersistenceContextInternal();
111+
final ActionQueue actionQueue = session.getActionQueue();
112+
LOG.debugf(
113+
"Flushed: %s insertions, %s updates, %s deletions to %s objects",
114+
actionQueue.numberOfInsertions(),
115+
actionQueue.numberOfUpdates(),
116+
actionQueue.numberOfDeletions(),
117+
persistenceContext.getNumberOfManagedEntities()
118+
);
119+
LOG.debugf(
120+
"Flushed: %s (re)creations, %s updates, %s removals to %s collections",
121+
actionQueue.numberOfCollectionCreations(),
122+
actionQueue.numberOfCollectionUpdates(),
123+
actionQueue.numberOfCollectionRemovals(),
124+
persistenceContext.getCollectionEntriesSize()
125+
);
126+
new EntityPrinter( session.getFactory() )
127+
.logEntities( persistenceContext.getEntityHoldersByKey().entrySet() );
111128
}
112-
final EventSource session = event.getSession();
113-
final PersistenceContext persistenceContext = session.getPersistenceContextInternal();
114-
final ActionQueue actionQueue = session.getActionQueue();
115-
LOG.debugf(
116-
"Flushed: %s insertions, %s updates, %s deletions to %s objects",
117-
actionQueue.numberOfInsertions(),
118-
actionQueue.numberOfUpdates(),
119-
actionQueue.numberOfDeletions(),
120-
persistenceContext.getNumberOfManagedEntities()
121-
);
122-
LOG.debugf(
123-
"Flushed: %s (re)creations, %s updates, %s removals to %s collections",
124-
actionQueue.numberOfCollectionCreations(),
125-
actionQueue.numberOfCollectionUpdates(),
126-
actionQueue.numberOfCollectionRemovals(),
127-
persistenceContext.getCollectionEntriesSize()
128-
);
129-
new EntityPrinter( session.getFactory() ).toString(
130-
persistenceContext.getEntityHoldersByKey().entrySet()
131-
);
132129
}
133130

134131
/**
@@ -140,8 +137,8 @@ private void prepareEntityFlushes(EventSource session, PersistenceContext persis
140137

141138
LOG.debug( "Processing flush-time cascades" );
142139

143-
final PersistContext context = getContext( session );
144-
//safe from concurrent modification because of how concurrentEntries() is implemented on IdentityMap
140+
final PersistContext context = PersistContext.create();
141+
// safe from concurrent modification because of how concurrentEntries() is implemented on IdentityMap
145142
for ( Map.Entry<Object,EntityEntry> me : persistenceContext.reentrantSafeEntityEntries() ) {
146143
// for ( Map.Entry me : IdentityMap.concurrentEntries( persistenceContext.getEntityEntries() ) ) {
147144
final EntityEntry entry = me.getValue();
@@ -150,6 +147,10 @@ private void prepareEntityFlushes(EventSource session, PersistenceContext persis
150147
}
151148
}
152149

150+
checkForTransientReferences( session, persistenceContext );
151+
}
152+
153+
void checkForTransientReferences(EventSource session, PersistenceContext persistenceContext) {
153154
// perform these checks after all cascade persist events have been
154155
// processed, so that all entities which will be persisted are
155156
// persistent when we do the check (I wonder if we could move this
@@ -181,21 +182,13 @@ private void cascadeOnFlush(EventSource session, EntityPersister persister, Obje
181182
final PersistenceContext persistenceContext = session.getPersistenceContextInternal();
182183
persistenceContext.incrementCascadeLevel();
183184
try {
184-
Cascade.cascade( getCascadingAction(session), CascadePoint.BEFORE_FLUSH, session, persister, object, anything );
185+
Cascade.cascade( CascadingActions.PERSIST_ON_FLUSH, CascadePoint.BEFORE_FLUSH, session, persister, object, anything );
185186
}
186187
finally {
187188
persistenceContext.decrementCascadeLevel();
188189
}
189190
}
190191

191-
protected PersistContext getContext(EventSource session) {
192-
return PersistContext.create();
193-
}
194-
195-
protected CascadingAction<PersistContext> getCascadingAction(EventSource session) {
196-
return CascadingActions.PERSIST_ON_FLUSH;
197-
}
198-
199192
/**
200193
* Initialize the flags of the CollectionEntry, including the
201194
* dirty check.

hibernate-core/src/main/java/org/hibernate/event/internal/DefaultDirtyCheckEventListener.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66

77
import org.hibernate.HibernateException;
88
import org.hibernate.engine.spi.ActionQueue;
9+
import org.hibernate.engine.spi.PersistenceContext;
910
import org.hibernate.event.spi.DirtyCheckEvent;
1011
import org.hibernate.event.spi.DirtyCheckEventListener;
12+
import org.hibernate.event.spi.EventSource;
1113
import org.hibernate.internal.CoreLogging;
1214
import org.hibernate.internal.CoreMessageLogger;
1315

@@ -29,7 +31,7 @@ public class DefaultDirtyCheckEventListener extends AbstractFlushingEventListene
2931
@Override
3032
public void onDirtyCheck(DirtyCheckEvent event) throws HibernateException {
3133
final ActionQueue actionQueue = event.getSession().getActionQueue();
32-
int oldSize = actionQueue.numberOfCollectionRemovals();
34+
final int oldSize = actionQueue.numberOfCollectionRemovals();
3335

3436
try {
3537
flushEverythingToExecutions(event);
@@ -46,4 +48,9 @@ public void onDirtyCheck(DirtyCheckEvent event) throws HibernateException {
4648
actionQueue.clearFromFlushNeededCheck( oldSize );
4749
}
4850
}
51+
52+
@Override
53+
void checkForTransientReferences(EventSource session, PersistenceContext persistenceContext) {
54+
// suppress the check
55+
}
4956
}

hibernate-core/src/main/java/org/hibernate/internal/util/EntityPrinter.java

Lines changed: 46 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -44,42 +44,39 @@ public String toString(String entityName, Object entity) throws HibernateExcepti
4444
if ( entityPersister == null || !entityPersister.isInstance( entity ) ) {
4545
return entity.getClass().getName();
4646
}
47-
48-
Map<String, String> result = new HashMap<>();
49-
50-
if ( entityPersister.hasIdentifierProperty() ) {
51-
result.put(
52-
entityPersister.getIdentifierPropertyName(),
53-
entityPersister.getIdentifierType().toLoggableString(
54-
entityPersister.getIdentifier( entity ),
55-
factory
56-
)
57-
);
58-
}
59-
60-
Type[] types = entityPersister.getPropertyTypes();
61-
String[] names = entityPersister.getPropertyNames();
62-
Object[] values = entityPersister.getValues( entity );
63-
for ( int i = 0; i < types.length; i++ ) {
64-
if ( !names[i].startsWith( "_" ) ) {
65-
final String strValue;
66-
if ( values[i] == LazyPropertyInitializer.UNFETCHED_PROPERTY ) {
67-
strValue = values[i].toString();
68-
}
69-
else if ( !Hibernate.isInitialized( values[i] ) ) {
70-
strValue = "<uninitialized>";
71-
}
72-
else {
73-
strValue = types[i].toLoggableString( values[i], factory );
47+
else {
48+
final Map<String, String> result = new HashMap<>();
49+
if ( entityPersister.hasIdentifierProperty() ) {
50+
result.put(
51+
entityPersister.getIdentifierPropertyName(),
52+
entityPersister.getIdentifierType()
53+
.toLoggableString( entityPersister.getIdentifier( entity ), factory )
54+
);
55+
}
56+
final Type[] types = entityPersister.getPropertyTypes();
57+
final String[] names = entityPersister.getPropertyNames();
58+
final Object[] values = entityPersister.getValues( entity );
59+
for ( int i = 0; i < types.length; i++ ) {
60+
if ( !names[i].startsWith( "_" ) ) {
61+
final String strValue;
62+
if ( values[i] == LazyPropertyInitializer.UNFETCHED_PROPERTY ) {
63+
strValue = values[i].toString();
64+
}
65+
else if ( !Hibernate.isInitialized( values[i] ) ) {
66+
strValue = "<uninitialized>";
67+
}
68+
else {
69+
strValue = types[i].toLoggableString( values[i], factory );
70+
}
71+
result.put( names[i], strValue );
7472
}
75-
result.put( names[i], strValue );
7673
}
74+
return entityName + result;
7775
}
78-
return entityName + result;
7976
}
8077

8178
public String toString(Type[] types, Object[] values) throws HibernateException {
82-
StringBuilder buffer = new StringBuilder();
79+
final StringBuilder buffer = new StringBuilder();
8380
for ( int i = 0; i < types.length; i++ ) {
8481
if ( types[i] != null ) {
8582
buffer.append( types[i].toLoggableString( values[i], factory ) ).append( ", " );
@@ -89,36 +86,32 @@ public String toString(Type[] types, Object[] values) throws HibernateException
8986
}
9087

9188
public String toString(Map<String, TypedValue> namedTypedValues) throws HibernateException {
92-
Map<String, String> result = new HashMap<>();
89+
final Map<String, String> result = new HashMap<>();
9390
for ( Map.Entry<String, TypedValue> entry : namedTypedValues.entrySet() ) {
94-
result.put(
95-
entry.getKey(), entry.getValue().getType().toLoggableString(
96-
entry.getValue().getValue(),
97-
factory
98-
)
99-
);
91+
final String key = entry.getKey();
92+
final TypedValue value = entry.getValue();
93+
result.put( key, value.getType().toLoggableString( value.getValue(), factory ) );
10094
}
10195
return result.toString();
10296
}
10397

10498
// Cannot use Map as an argument because it clashes with the previous method (due to type erasure)
105-
public void toString(Iterable<Map.Entry<EntityKey, EntityHolder>> entitiesByEntityKey) throws HibernateException {
106-
if ( !LOG.isDebugEnabled() || !entitiesByEntityKey.iterator().hasNext() ) {
107-
return;
108-
}
109-
110-
LOG.debug( "Listing entities:" );
111-
int i = 0;
112-
for ( Map.Entry<EntityKey, EntityHolder> entityKeyAndEntity : entitiesByEntityKey ) {
113-
final EntityHolder holder = entityKeyAndEntity.getValue();
114-
if ( holder.getEntity() == null ) {
115-
continue;
116-
}
117-
if ( i++ > 20 ) {
118-
LOG.debug( "More......" );
119-
break;
99+
public void logEntities(Iterable<Map.Entry<EntityKey, EntityHolder>> entitiesByEntityKey)
100+
throws HibernateException {
101+
if ( LOG.isDebugEnabled() && entitiesByEntityKey.iterator().hasNext() ) {
102+
LOG.debug( "Listing entities:" );
103+
int i = 0;
104+
for ( Map.Entry<EntityKey, EntityHolder> entityKeyAndEntity : entitiesByEntityKey ) {
105+
final EntityHolder holder = entityKeyAndEntity.getValue();
106+
if ( holder.getEntity() == null ) {
107+
continue;
108+
}
109+
if ( i++ > 20 ) {
110+
LOG.debug( "More......" );
111+
break;
112+
}
113+
LOG.debug( toString( entityKeyAndEntity.getKey().getEntityName(), holder.getEntity() ) );
120114
}
121-
LOG.debug( toString( entityKeyAndEntity.getKey().getEntityName(), holder.getEntity() ) );
122115
}
123116
}
124117

hibernate-core/src/main/java/org/hibernate/type/EntityType.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
import org.hibernate.proxy.LazyInitializer;
2626
import org.hibernate.type.spi.TypeConfiguration;
2727

28-
import static org.hibernate.engine.internal.ForeignKeys.getEntityIdentifierIfNotUnsaved;
28+
import static org.hibernate.engine.internal.ForeignKeys.getEntityIdentifier;
2929
import static org.hibernate.engine.internal.ManagedTypeHelper.asPersistentAttributeInterceptable;
3030
import static org.hibernate.engine.internal.ManagedTypeHelper.isPersistentAttributeInterceptable;
3131
import static org.hibernate.proxy.HibernateProxy.extractLazyInitializer;
@@ -449,7 +449,7 @@ public EntityPersister getAssociatedEntityPersister(final SessionFactoryImplemen
449449
protected final Object getIdentifier(Object value, SharedSessionContractImplementor session)
450450
throws HibernateException {
451451
if ( isReferenceToIdentifierProperty() ) {
452-
return getEntityIdentifierIfNotUnsaved( getAssociatedEntityName(), value, session ); //tolerates nulls
452+
return getEntityIdentifier( getAssociatedEntityName(), value, session ); //tolerates nulls
453453
}
454454
else if ( value == null ) {
455455
return null;

0 commit comments

Comments
 (0)