[hibernate-commits] Hibernate SVN: r18643 - in core/trunk: testsuite/src/test/java/org/hibernate/test/readonly and 1 other directory.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Wed Jan 27 04:26:43 EST 2010


Author: gbadner
Date: 2010-01-27 04:26:42 -0500 (Wed, 27 Jan 2010)
New Revision: 18643

Modified:
   core/trunk/core/src/main/java/org/hibernate/event/def/DefaultRefreshEventListener.java
   core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/ReadOnlyProxyTest.java
   core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/ReadOnlySessionLazyNonLazyTest.java
   core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/ReadOnlySessionTest.java
   core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/ReadOnlyTest.java
Log:
HHH-4781 : Read-only entities changed to modifiable on refresh

Modified: core/trunk/core/src/main/java/org/hibernate/event/def/DefaultRefreshEventListener.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/event/def/DefaultRefreshEventListener.java	2010-01-27 08:00:27 UTC (rev 18642)
+++ core/trunk/core/src/main/java/org/hibernate/event/def/DefaultRefreshEventListener.java	2010-01-27 09:26:42 UTC (rev 18643)
@@ -71,7 +71,13 @@
 
 		final EventSource source = event.getSession();
 		
-		if ( source.getPersistenceContext().reassociateIfUninitializedProxy( event.getObject() ) ) return;
+		boolean isTransient = ! source.contains( event.getObject() );
+		if ( source.getPersistenceContext().reassociateIfUninitializedProxy( event.getObject() ) ) {
+			if ( isTransient ) {
+				source.setReadOnly( event.getObject(), source.isDefaultReadOnly() );
+			}
+			return;
+		}
 
 		final Object object = source.getPersistenceContext().unproxyAndReassociate( event.getObject() );
 
@@ -143,6 +149,9 @@
 		String previousFetchProfile = source.getFetchProfile();
 		source.setFetchProfile("refresh");
 		Object result = persister.load( id, object, event.getLockOptions(), source );
+		// Keep the same read-only/modifiable setting for the entity that it had before refreshing;
+		// If it was transient, then set it to the default for the source.
+		source.setReadOnly( result, ( e == null ? source.isDefaultReadOnly() : e.isReadOnly() ) );
 		source.setFetchProfile(previousFetchProfile);
 		
 		UnresolvableObjectException.throwIfNull( result, id, persister.getEntityName() );

Modified: core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/ReadOnlyProxyTest.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/ReadOnlyProxyTest.java	2010-01-27 08:00:27 UTC (rev 18642)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/ReadOnlyProxyTest.java	2010-01-27 09:26:42 UTC (rev 18643)
@@ -840,6 +840,95 @@
 		s.close();
 	}
 
+	public void testReadOnlyRefresh() {
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		Transaction t = s.beginTransaction();
+		DataPoint dp = new DataPoint();
+		dp.setDescription( "original" );
+		dp.setX( new BigDecimal(0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+		dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+		s.save(dp);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		t = s.beginTransaction();
+		dp = ( DataPoint ) s.load( DataPoint.class, dp.getId() );
+		s.setReadOnly( dp, true );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		s.refresh( dp );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		assertEquals( "original", dp.getDescription() );
+		assertTrue( Hibernate.isInitialized( dp ) );
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
+		assertTrue( s.isReadOnly( dp ) );
+		assertTrue( s.isReadOnly( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().getImplementation() ) );
+		s.refresh( dp );
+		assertEquals( "original", dp.getDescription() );
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
+		assertTrue( s.isReadOnly( dp ) );
+		assertTrue( s.isReadOnly( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().getImplementation() ) );
+		t.commit();
+
+		s.clear();
+		t = s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dp.getId() );
+		assertEquals( "original", dp.getDescription() );
+		s.delete( dp );
+		t.commit();
+		s.close();
+
+	}
+
+	public void testReadOnlyRefreshDetached() {
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		Transaction t = s.beginTransaction();
+		DataPoint dp = new DataPoint();
+		dp.setDescription( "original" );
+		dp.setX( new BigDecimal(0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+		dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+		s.save(dp);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		t = s.beginTransaction();
+		dp = ( DataPoint ) s.load( DataPoint.class, dp.getId() );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		assertFalse( s.isReadOnly( dp ) );
+		s.setReadOnly( dp, true );
+		assertTrue( s.isReadOnly( dp ) );
+		s.evict( dp );
+		s.refresh( dp );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		assertFalse( s.isReadOnly( dp ) );
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
+		assertTrue( Hibernate.isInitialized( dp ) );
+		s.setReadOnly( dp, true );
+		s.evict( dp );
+		s.refresh( dp );
+		assertEquals( "original", dp.getDescription() );
+		assertFalse( s.isReadOnly( dp ) );
+		t.commit();
+
+		s.clear();
+		t = s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dp.getId() );
+		assertEquals( "original", dp.getDescription() );
+		s.delete( dp );
+		t.commit();
+		s.close();
+	}
+
 	public void testReadOnlyProxyMergeDetachedProxyWithChange() {
 		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
 

Modified: core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/ReadOnlySessionLazyNonLazyTest.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/ReadOnlySessionLazyNonLazyTest.java	2010-01-27 08:00:27 UTC (rev 18642)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/ReadOnlySessionLazyNonLazyTest.java	2010-01-27 09:26:42 UTC (rev 18643)
@@ -124,7 +124,7 @@
 		c = ( Container ) s.get( Container.class, cOrig.getId() );
 		assertSame( cOrig, c );
 		checkContainer( cOrig, expectedInitializedObjects, expectedReadOnlyObjects, s );
-		//s.refresh( cOrig );
+		s.refresh( cOrig );
 		assertSame( cOrig, c );
 		checkContainer( cOrig, expectedInitializedObjects, expectedReadOnlyObjects, s );
 		s.evict( cOrig );

Modified: core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/ReadOnlySessionTest.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/ReadOnlySessionTest.java	2010-01-27 08:00:27 UTC (rev 18642)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/ReadOnlySessionTest.java	2010-01-27 09:26:42 UTC (rev 18643)
@@ -40,6 +40,7 @@
 import org.hibernate.cfg.Environment;
 import org.hibernate.junit.functional.FunctionalTestCase;
 import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.proxy.HibernateProxy;
 
 /**
  *
@@ -183,7 +184,7 @@
 		s.close();
 	}
 
-	public void testReadOnlyRefreshFailureExpected() {
+	public void testReadOnlyRefresh() {
 
 		Session s = openSession();
 		s.setCacheMode(CacheMode.IGNORE);
@@ -201,11 +202,18 @@
 		s.setDefaultReadOnly( true );
 		t = s.beginTransaction();
 		dp = ( DataPoint ) s.get( DataPoint.class, dp.getId() );
+		assertTrue( s.isReadOnly( dp ) );
 		assertEquals( "original", dp.getDescription() );
 		dp.setDescription( "changed" );
 		assertEquals( "changed", dp.getDescription() );
+		s.refresh( dp );
+		assertTrue( s.isReadOnly( dp ) );
+		assertEquals( "original", dp.getDescription() );
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
 		s.setDefaultReadOnly( false );
 		s.refresh( dp );
+		assertTrue( s.isReadOnly( dp ) );
 		assertEquals( "original", dp.getDescription() );
 		dp.setDescription( "changed" );
 		assertEquals( "changed", dp.getDescription() );
@@ -218,9 +226,171 @@
 		s.delete( dp );
 		t.commit();
 		s.close();
+	}
 
+	public void testReadOnlyRefreshDetached() {
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		Transaction t = s.beginTransaction();
+		DataPoint dp = new DataPoint();
+		dp.setDescription( "original" );
+		dp.setX( new BigDecimal(0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+		dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+		s.save(dp);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		t = s.beginTransaction();
+		s.setDefaultReadOnly( false );
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
+		s.refresh( dp );
+		assertEquals( "original", dp.getDescription() );
+		assertFalse( s.isReadOnly( dp ) );
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
+		s.evict( dp );
+		s.refresh( dp );
+		assertEquals( "original", dp.getDescription() );
+		assertFalse( s.isReadOnly( dp ) );
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
+		s.setDefaultReadOnly( true );
+		s.evict( dp );
+		s.refresh( dp );
+		assertEquals( "original", dp.getDescription() );
+		assertTrue( s.isReadOnly( dp ) );
+		dp.setDescription( "changed" );
+		t.commit();
+
+		s.clear();
+		t = s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dp.getId() );
+		assertEquals( "original", dp.getDescription() );
+		s.delete( dp );
+		t.commit();
+		s.close();
 	}
 
+	public void testReadOnlyProxyRefresh() {
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		Transaction t = s.beginTransaction();
+		DataPoint dp = new DataPoint();
+		dp.setDescription( "original" );
+		dp.setX( new BigDecimal(0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+		dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+		s.save(dp);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		t = s.beginTransaction();
+		s.setDefaultReadOnly( true );
+		dp = ( DataPoint ) s.load( DataPoint.class, dp.getId() );
+		assertTrue( s.isReadOnly( dp ) );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		s.refresh( dp );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		assertTrue( s.isReadOnly( dp ) );
+		s.setDefaultReadOnly( false );
+		s.refresh( dp );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		assertTrue( s.isReadOnly( dp ) );
+		assertEquals( "original", dp.getDescription() );
+		assertTrue( Hibernate.isInitialized( dp ) );
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
+		assertTrue( s.isReadOnly( dp ) );
+		assertTrue( s.isReadOnly( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().getImplementation() ) );
+		s.refresh( dp );
+		assertEquals( "original", dp.getDescription() );
+		assertTrue( s.isReadOnly( dp ) );
+		assertTrue( s.isReadOnly( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().getImplementation() ) );
+		s.setDefaultReadOnly( true );
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
+		s.refresh( dp );
+		assertTrue( s.isReadOnly( dp ) );
+		assertTrue( s.isReadOnly( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().getImplementation() ) );
+		assertEquals( "original", dp.getDescription() );
+		dp.setDescription( "changed" );
+		t.commit();
+
+		s.clear();
+		t = s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dp.getId() );
+		assertEquals( "original", dp.getDescription() );
+		s.delete( dp );
+		t.commit();
+		s.close();
+
+	}
+
+	public void testReadOnlyProxyRefreshDetached() {
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		Transaction t = s.beginTransaction();
+		DataPoint dp = new DataPoint();
+		dp.setDescription( "original" );
+		dp.setX( new BigDecimal(0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+		dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+		s.save(dp);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		t = s.beginTransaction();
+		s.setDefaultReadOnly( true );
+		dp = ( DataPoint ) s.load( DataPoint.class, dp.getId() );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		assertTrue( s.isReadOnly( dp ) );
+		s.evict( dp );
+		s.refresh( dp );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		s.setDefaultReadOnly( false );
+		assertTrue( s.isReadOnly( dp ) );
+		s.evict( dp );
+		s.refresh( dp );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		assertFalse( s.isReadOnly( dp ) );
+		assertFalse( s.isReadOnly( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().getImplementation() ) );
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
+		assertTrue( Hibernate.isInitialized( dp ) );
+		s.evict( dp );
+		s.refresh( dp );
+		assertEquals( "original", dp.getDescription() );
+		assertFalse( s.isReadOnly( dp ) );
+		assertFalse( s.isReadOnly( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().getImplementation() ) );
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
+		s.setDefaultReadOnly( true );
+		s.evict( dp );
+		s.refresh( dp );
+		assertEquals( "original", dp.getDescription() );
+		assertTrue( s.isReadOnly( dp ) );
+		assertTrue( s.isReadOnly( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().getImplementation() ) );		
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
+		t.commit();
+
+		s.clear();
+		t = s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dp.getId() );
+		assertEquals( "original", dp.getDescription() );
+		s.delete( dp );
+		t.commit();
+		s.close();
+	}
+
 	public void testReadOnlyDelete() {
 
 		Session s = openSession();
@@ -453,4 +623,56 @@
 		s.close();
 
 	}
+
+	public void testMergeWithReadOnlyProxy() {
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		Transaction t = s.beginTransaction();
+		DataPoint dp = new DataPoint();
+		dp.setX( new BigDecimal(0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+		dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+		s.save(dp);
+		t.commit();
+		s.close();
+
+		dp.setDescription( "description" );
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		t = s.beginTransaction();
+		s.setDefaultReadOnly( true );
+		DataPoint dpProxy = ( DataPoint ) s.load( DataPoint.class, new Long( dp.getId() ) );
+		assertTrue( s.isReadOnly( dpProxy ) );
+		assertFalse( Hibernate.isInitialized( dpProxy ) );
+		s.evict( dpProxy );
+		dpProxy = ( DataPoint ) s.merge( dpProxy );
+		assertTrue( s.isReadOnly( dpProxy ) );
+		assertFalse( Hibernate.isInitialized( dpProxy ) );
+		dpProxy = ( DataPoint ) s.merge( dp );
+		assertTrue( s.isReadOnly( dpProxy ) );
+		assertTrue( Hibernate.isInitialized( dpProxy ) );
+		assertEquals( "description", dpProxy.getDescription() );
+		s.evict( dpProxy );
+		dpProxy = ( DataPoint ) s.merge( dpProxy );
+		assertTrue( s.isReadOnly( dpProxy ) );
+		assertTrue( Hibernate.isInitialized( dpProxy ) );
+		assertEquals( "description", dpProxy.getDescription() );
+		dpProxy.setDescription( null );
+		dpProxy = ( DataPoint ) s.merge( dp );
+		assertTrue( s.isReadOnly( dpProxy ) );
+		assertTrue( Hibernate.isInitialized( dpProxy ) );
+		assertEquals( "description", dpProxy.getDescription() );		
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, new Long( dp.getId() ) );
+		assertNull( dp.getDescription() );
+		s.delete( dp );
+		t.commit();
+		s.close();
+
+	}
 }
\ No newline at end of file

Modified: core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/ReadOnlyTest.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/ReadOnlyTest.java	2010-01-27 08:00:27 UTC (rev 18642)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/ReadOnlyTest.java	2010-01-27 09:26:42 UTC (rev 18643)
@@ -169,7 +169,7 @@
 
 	}
 
-	public void testReadOnlyRefreshFailureExpected() {
+	public void testReadOnlyRefresh() {
 
 		Session s = openSession();
 		s.setCacheMode(CacheMode.IGNORE);
@@ -206,6 +206,45 @@
 
 	}
 
+	public void testReadOnlyRefreshDetached() {
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		Transaction t = s.beginTransaction();
+		DataPoint dp = new DataPoint();
+		dp.setDescription( "original" );
+		dp.setX( new BigDecimal(0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+		dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+		s.save(dp);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		t = s.beginTransaction();
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
+		s.refresh( dp );
+		assertEquals( "original", dp.getDescription() );
+		assertFalse( s.isReadOnly( dp ) );
+		s.setReadOnly( dp, true );
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
+		s.evict( dp );
+		s.refresh( dp );
+		assertEquals( "original", dp.getDescription() );
+		assertFalse( s.isReadOnly( dp ) );
+		t.commit();
+
+		s.clear();
+		t = s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dp.getId() );
+		assertEquals( "original", dp.getDescription() );
+		s.delete( dp );
+		t.commit();
+		s.close();
+	}
+
 	public void testReadOnlyDelete() {
 
 		Session s = openSession();



More information about the hibernate-commits mailing list