From 94415151f7bd68796341d8f0126e2f205fd78071 Mon Sep 17 00:00:00 2001 From: Gail Badner Date: Wed, 13 Jan 2010 06:02:14 +0000 Subject: [PATCH] HHH-4737 : Cache the EntityKey in EntityEntry when id is non-null git-svn-id: https://svn.jboss.org/repos/hibernate/core/trunk@18528 1b8cb986-b30d-0410-93ca-fae66ebed9b2 --- .../hibernate/action/EntityDeleteAction.java | 5 ++--- .../java/org/hibernate/engine/EntityEntry.java | 18 +++++++++++++++++- .../engine/StatefulPersistenceContext.java | 3 +-- .../org/hibernate/engine/TwoPhaseLoad.java | 5 +---- .../event/def/DefaultEvictEventListener.java | 5 ++--- 5 files changed, 23 insertions(+), 13 deletions(-) diff --git a/core/src/main/java/org/hibernate/action/EntityDeleteAction.java b/core/src/main/java/org/hibernate/action/EntityDeleteAction.java index 28e3961a26..77838cc304 100644 --- a/core/src/main/java/org/hibernate/action/EntityDeleteAction.java +++ b/core/src/main/java/org/hibernate/action/EntityDeleteAction.java @@ -108,9 +108,8 @@ public final class EntityDeleteAction extends EntityAction { } entry.postDelete(); - EntityKey key = new EntityKey( entry.getId(), entry.getPersister(), session.getEntityMode() ); - persistenceContext.removeEntity(key); - persistenceContext.removeProxy(key); + persistenceContext.removeEntity( entry.getEntityKey() ); + persistenceContext.removeProxy( entry.getEntityKey() ); if ( persister.hasCache() ) { persister.getCacheAccessStrategy().remove( ck ); diff --git a/core/src/main/java/org/hibernate/engine/EntityEntry.java b/core/src/main/java/org/hibernate/engine/EntityEntry.java index e671a67bb2..e14b7ed1a6 100644 --- a/core/src/main/java/org/hibernate/engine/EntityEntry.java +++ b/core/src/main/java/org/hibernate/engine/EntityEntry.java @@ -56,6 +56,7 @@ public final class EntityEntry implements Serializable { private transient EntityPersister persister; // for convenience to save some lookups private final EntityMode entityMode; private final String entityName; + private transient EntityKey cachedEntityKey; // cached EntityKey (lazy-initialized) private boolean isBeingReplicated; private boolean loadedWithLazyPropertiesUnfetched; //NOTE: this is not updated when properties are fetched lazily! private final transient Object rowId; @@ -165,6 +166,21 @@ public final class EntityEntry implements Serializable { return persister; } + /** + * Get the EntityKey based on this EntityEntry. + * @return the EntityKey + * @throws IllegalStateException if getId() is null + */ + public EntityKey getEntityKey() { + if ( cachedEntityKey == null ) { + if ( getId() == null ) { + throw new IllegalStateException( "cannot generate an EntityKey when id is null."); + } + cachedEntityKey = new EntityKey( getId(), getPersister(), entityMode ); + } + return cachedEntityKey; + } + void afterDeserialize(SessionFactoryImplementor factory) { persister = factory.getEntityPersister( entityName ); } @@ -225,7 +241,7 @@ public final class EntityEntry implements Serializable { earlyInsert ? !isExistsInDatabase() : session.getPersistenceContext().getNullifiableEntityKeys() - .contains( new EntityKey( getId(), getPersister(), entityMode ) ) + .contains( getEntityKey() ) ); } diff --git a/core/src/main/java/org/hibernate/engine/StatefulPersistenceContext.java b/core/src/main/java/org/hibernate/engine/StatefulPersistenceContext.java index 805b75628a..6097d9fa3e 100644 --- a/core/src/main/java/org/hibernate/engine/StatefulPersistenceContext.java +++ b/core/src/main/java/org/hibernate/engine/StatefulPersistenceContext.java @@ -698,8 +698,7 @@ public class StatefulPersistenceContext implements PersistenceContext { */ public Object proxyFor(Object impl) throws HibernateException { EntityEntry e = getEntry(impl); - EntityPersister p = e.getPersister(); - return proxyFor( p, new EntityKey( e.getId(), p, session.getEntityMode() ), impl ); + return proxyFor( e.getPersister(), e.getEntityKey(), impl ); } /** diff --git a/core/src/main/java/org/hibernate/engine/TwoPhaseLoad.java b/core/src/main/java/org/hibernate/engine/TwoPhaseLoad.java index 84eeaf23f4..ac17d89448 100755 --- a/core/src/main/java/org/hibernate/engine/TwoPhaseLoad.java +++ b/core/src/main/java/org/hibernate/engine/TwoPhaseLoad.java @@ -191,10 +191,7 @@ public final class TwoPhaseLoad { } boolean isReallyReadOnly = readOnly || !persister.isMutable(); - Object proxy = persistenceContext.getProxy( - new EntityKey(entityEntry.getId(), entityEntry.getPersister(), session.getEntityMode() - ) - ); + Object proxy = persistenceContext.getProxy( entityEntry.getEntityKey() ); if ( proxy != null ) { // there is already a proxy for this impl // only set the status to read-only if the proxy is read-only diff --git a/core/src/main/java/org/hibernate/event/def/DefaultEvictEventListener.java b/core/src/main/java/org/hibernate/event/def/DefaultEvictEventListener.java index bfc70cadbe..74c9d1b217 100644 --- a/core/src/main/java/org/hibernate/event/def/DefaultEvictEventListener.java +++ b/core/src/main/java/org/hibernate/event/def/DefaultEvictEventListener.java @@ -88,9 +88,8 @@ public class DefaultEvictEventListener implements EvictEventListener { else { EntityEntry e = persistenceContext.removeEntry( object ); if ( e != null ) { - EntityKey key = new EntityKey( e.getId(), e.getPersister(), source.getEntityMode() ); - persistenceContext.removeEntity( key ); - doEvict( object, key, e.getPersister(), source ); + persistenceContext.removeEntity( e.getEntityKey() ); + doEvict( object, e.getEntityKey(), e.getPersister(), source ); } } }