[hibernate-commits] Hibernate SVN: r18759 - core/trunk/core/src/main/java/org/hibernate/event/def.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Wed Feb 10 02:03:48 EST 2010


Author: gbadner
Date: 2010-02-10 02:03:48 -0500 (Wed, 10 Feb 2010)
New Revision: 18759

Modified:
   core/trunk/core/src/main/java/org/hibernate/event/def/DefaultLoadEventListener.java
Log:
HHH-4896 : Read-only proxy targets initialized from second-level cache are not read-only

Modified: core/trunk/core/src/main/java/org/hibernate/event/def/DefaultLoadEventListener.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/event/def/DefaultLoadEventListener.java	2010-02-10 07:00:59 UTC (rev 18758)
+++ core/trunk/core/src/main/java/org/hibernate/event/def/DefaultLoadEventListener.java	2010-02-10 07:03:48 UTC (rev 18759)
@@ -635,8 +635,9 @@
 				session.instantiate( subclassPersister, id ) : optionalObject;
 
 		// make it circular-reference safe
+		EntityKey entityKey = new EntityKey( id, subclassPersister, session.getEntityMode() );
 		TwoPhaseLoad.addUninitializedCachedEntity(
-				new EntityKey( id, subclassPersister, session.getEntityMode() ),
+				entityKey,
 				result,
 				subclassPersister,
 				LockMode.NONE,
@@ -659,12 +660,21 @@
 		if ( log.isTraceEnabled() ) log.trace( "Cached Version: " + version );
 
 		final PersistenceContext persistenceContext = session.getPersistenceContext();
+		boolean isReadOnly = session.isDefaultReadOnly();
+		if ( persister.isMutable() ) {
+			Object proxy = persistenceContext.getProxy( entityKey );
+			if ( proxy != null ) {
+				// there is already a proxy for this impl
+				// only set the status to read-only if the proxy is read-only
+				isReadOnly = ( ( HibernateProxy ) proxy ).getHibernateLazyInitializer().isReadOnly();
+			}
+		}
+		else {
+			isReadOnly = true;
+		}
 		persistenceContext.addEntry(
 				result,
-				( session.isDefaultReadOnly() || ! persister.isMutable() ? 
-						Status.READ_ONLY :
-						Status.MANAGED
-				),
+				( isReadOnly ? Status.READ_ONLY : Status.MANAGED ),
 				values,
 				null,
 				id,



More information about the hibernate-commits mailing list