[hibernate-commits] Hibernate SVN: r18760 - core/trunk/core/src/main/java/org/hibernate/loader.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Wed Feb 10 02:05:33 EST 2010


Author: gbadner
Date: 2010-02-10 02:05:33 -0500 (Wed, 10 Feb 2010)
New Revision: 18760

Modified:
   core/trunk/core/src/main/java/org/hibernate/loader/Loader.java
Log:
HHH-4898 : Results from read-only Criteria and Query obtained from query cache are not read-only

Modified: core/trunk/core/src/main/java/org/hibernate/loader/Loader.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/loader/Loader.java	2010-02-10 07:03:48 UTC (rev 18759)
+++ core/trunk/core/src/main/java/org/hibernate/loader/Loader.java	2010-02-10 07:05:33 UTC (rev 18760)
@@ -2170,14 +2170,14 @@
 				session
 		);
 		
-		List result = getResultFromQueryCache( 
+		List result = getResultFromQueryCache(
 				session, 
 				queryParameters, 
 				querySpaces, 
 				resultTypes, 
 				queryCache, 
 				key 
-		);
+			);
 
 		if ( result == null ) {
 			result = doList( session, queryParameters );
@@ -2207,7 +2207,26 @@
 		if ( session.getCacheMode().isGetEnabled() ) {
 			boolean isImmutableNaturalKeyLookup = queryParameters.isNaturalKeyLookup()
 					&& getEntityPersisters()[0].getEntityMetamodel().hasImmutableNaturalId();
-			result = queryCache.get( key, resultTypes, isImmutableNaturalKeyLookup, querySpaces, session );
+
+			final PersistenceContext persistenceContext = session.getPersistenceContext();
+			boolean defaultReadOnlyOrig = persistenceContext.isDefaultReadOnly();
+			if ( queryParameters.isReadOnlyInitialized() ) {
+				// The read-only/modifiable mode for the query was explicitly set.
+				// Temporarily set the default read-only/modifiable setting to the query's setting.
+				persistenceContext.setDefaultReadOnly( queryParameters.isReadOnly() );
+			}
+			else {
+				// The read-only/modifiable setting for the query was not initialized.
+				// Use the default read-only/modifiable from the persistence context instead.
+				queryParameters.setReadOnly( persistenceContext.isDefaultReadOnly() );
+			}
+			try {
+				result = queryCache.get( key, resultTypes, isImmutableNaturalKeyLookup, querySpaces, session );
+			}
+			finally {
+				persistenceContext.setDefaultReadOnly( defaultReadOnlyOrig );
+			}
+
 			if ( factory.getStatistics().isStatisticsEnabled() ) {
 				if ( result == null ) {
 					factory.getStatisticsImplementor()



More information about the hibernate-commits mailing list