[hibernate-commits] Hibernate SVN: r11645 - in branches/Branch_3_2/Hibernate3: src/org/hibernate/event/def and 4 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Wed Jun 6 17:33:31 EDT 2007


Author: steve.ebersole at jboss.com
Date: 2007-06-06 17:33:31 -0400 (Wed, 06 Jun 2007)
New Revision: 11645

Added:
   branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/NaturalIdSuite.java
   branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/immutable/
   branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/immutable/ImmutableNaturalIdTest.java
   branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/immutable/User.hbm.xml
   branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/immutable/User.java
   branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/mutable/
   branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/mutable/MutableNaturalIdTest.java
   branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/mutable/User.hbm.xml
   branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/mutable/User.java
Removed:
   branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/NaturalIdTest.java
   branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/User.hbm.xml
   branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/User.java
Modified:
   branches/Branch_3_2/Hibernate3/src/org/hibernate/engine/PersistenceContext.java
   branches/Branch_3_2/Hibernate3/src/org/hibernate/event/def/DefaultFlushEntityEventListener.java
   branches/Branch_3_2/Hibernate3/test/org/hibernate/test/AllTests.java
Log:
HHH-1569 : natural-id check

Modified: branches/Branch_3_2/Hibernate3/src/org/hibernate/engine/PersistenceContext.java
===================================================================
--- branches/Branch_3_2/Hibernate3/src/org/hibernate/engine/PersistenceContext.java	2007-06-06 21:33:10 UTC (rev 11644)
+++ branches/Branch_3_2/Hibernate3/src/org/hibernate/engine/PersistenceContext.java	2007-06-06 21:33:31 UTC (rev 11645)
@@ -83,6 +83,11 @@
 
 	public Object[] getCachedDatabaseSnapshot(EntityKey key);
 
+	/**
+	 * Get the values of the natural id fields as known to the underlying 
+	 * database, or null if the entity has no natural id or there is no 
+	 * corresponding row.
+	 */
 	public Object[] getNaturalIdSnapshot(Serializable id, EntityPersister persister)
 	throws HibernateException;
 
@@ -437,4 +442,4 @@
 	public void setReadOnly(Object entity, boolean readOnly);
 
 	void replaceDelayedEntityIdentityInsertKeys(EntityKey oldKey, Serializable generatedId);
-}
\ No newline at end of file
+}

Modified: branches/Branch_3_2/Hibernate3/src/org/hibernate/event/def/DefaultFlushEntityEventListener.java
===================================================================
--- branches/Branch_3_2/Hibernate3/src/org/hibernate/event/def/DefaultFlushEntityEventListener.java	2007-06-06 21:33:10 UTC (rev 11644)
+++ branches/Branch_3_2/Hibernate3/src/org/hibernate/event/def/DefaultFlushEntityEventListener.java	2007-06-06 21:33:31 UTC (rev 11645)
@@ -74,16 +74,23 @@
 	        EntityMode entityMode,
 	        SessionImplementor session) {
 		if ( persister.hasNaturalIdentifier() ) {
-			if ( loaded == null ) {
-				loaded = session.getPersistenceContext().getNaturalIdSnapshot( identifier, persister );
-			}
+ 			Object[] snapshot = null;			
 			Type[] types = persister.getPropertyTypes();
 			int[] props = persister.getNaturalIdentifierProperties();
 			boolean[] updateable = persister.getPropertyUpdateability();
 			for ( int i=0; i<props.length; i++ ) {
 				int prop = props[i];
 				if ( !updateable[prop] ) {
-					if ( !types[prop].isEqual( current[prop], loaded[prop], entityMode ) ) {
+ 					Object loadedVal;
+ 					if ( loaded == null ) {
+ 						if ( snapshot == null) {
+ 							snapshot = session.getPersistenceContext().getNaturalIdSnapshot( identifier, persister );
+ 						}
+ 						loadedVal = snapshot[i];
+ 					} else {
+ 						loadedVal = loaded[prop];
+ 					}
+ 					if ( !types[prop].isEqual( current[prop], loadedVal, entityMode ) ) {						
 						throw new HibernateException(
 								"immutable natural identifier of an instance of " +
 								persister.getEntityName() +

Modified: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/AllTests.java
===================================================================
--- branches/Branch_3_2/Hibernate3/test/org/hibernate/test/AllTests.java	2007-06-06 21:33:10 UTC (rev 11644)
+++ branches/Branch_3_2/Hibernate3/test/org/hibernate/test/AllTests.java	2007-06-06 21:33:31 UTC (rev 11645)
@@ -49,6 +49,7 @@
 import org.hibernate.test.idclass.IdClassTest;
 import org.hibernate.test.idprops.IdentifierPropertyReferencesTest;
 import org.hibernate.test.immutable.ImmutableTest;
+import org.hibernate.test.insertordering.InsertOrderingTest;
 import org.hibernate.test.instrument.buildtime.InstrumentTest;
 import org.hibernate.test.instrument.runtime.CGLIBInstrumentationTest;
 import org.hibernate.test.instrument.runtime.JavassistInstrumentationTest;
@@ -91,7 +92,7 @@
 import org.hibernate.test.mapping.ValueVisitorTest;
 import org.hibernate.test.mappingexception.MappingExceptionTest;
 import org.hibernate.test.mixed.MixedTest;
-import org.hibernate.test.naturalid.NaturalIdTest;
+import org.hibernate.test.naturalid.NaturalIdSuite;
 import org.hibernate.test.ondelete.OnDeleteTest;
 import org.hibernate.test.onetomany.OneToManyTest;
 import org.hibernate.test.onetoone.OneToOneSuite;
@@ -104,6 +105,7 @@
 import org.hibernate.test.proxy.ProxyTest;
 import org.hibernate.test.querycache.QueryCacheTest;
 import org.hibernate.test.readonly.ReadOnlyTest;
+import org.hibernate.test.reattachment.ReattachmentSuite;
 import org.hibernate.test.rowid.RowIdTest;
 import org.hibernate.test.sorted.SortTest;
 import org.hibernate.test.sql.NativeSqlSupportSuite;
@@ -129,8 +131,6 @@
 import org.hibernate.test.version.db.DbVersionTest;
 import org.hibernate.test.version.sybase.SybaseTimestampVersioningTest;
 import org.hibernate.test.where.WhereTest;
-import org.hibernate.test.insertordering.InsertOrderingTest;
-import org.hibernate.test.reattachment.ReattachmentSuite;
 
 /**
  * @author Gavin King
@@ -194,7 +194,7 @@
 		public static Test unfilteredSuite() {
 			TestSuite suite = new TestSuite("New tests suite");
 			suite.addTest( OpsSuite.suite() );
-			suite.addTest( NaturalIdTest.suite() );
+			suite.addTest( NaturalIdSuite.suite() );
 			suite.addTest( ComponentSuite.suite() );
 			suite.addTest( ProxyTest.suite() );
 			suite.addTest( VersionTest.suite() );

Added: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/NaturalIdSuite.java
===================================================================
--- branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/NaturalIdSuite.java	                        (rev 0)
+++ branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/NaturalIdSuite.java	2007-06-06 21:33:31 UTC (rev 11645)
@@ -0,0 +1,21 @@
+package org.hibernate.test.naturalid;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.hibernate.test.naturalid.immutable.ImmutableNaturalIdTest;
+import org.hibernate.test.naturalid.mutable.MutableNaturalIdTest;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class NaturalIdSuite {
+	public static Test suite() {
+		TestSuite suite = new TestSuite( "natural ids" );
+		suite.addTest( MutableNaturalIdTest.suite() );
+		suite.addTest( ImmutableNaturalIdTest.suite() );
+		return suite;
+	}
+}

Deleted: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/NaturalIdTest.java
===================================================================
--- branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/NaturalIdTest.java	2007-06-06 21:33:10 UTC (rev 11644)
+++ branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/NaturalIdTest.java	2007-06-06 21:33:31 UTC (rev 11645)
@@ -1,248 +0,0 @@
-//$Id$
-package org.hibernate.test.naturalid;
-
-import java.lang.reflect.Field;
-
-import junit.framework.Test;
-
-import org.hibernate.HibernateException;
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.cfg.Configuration;
-import org.hibernate.cfg.Environment;
-import org.hibernate.criterion.Restrictions;
-import org.hibernate.junit.functional.FunctionalTestCase;
-import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
-
-/**
- * @author Gavin King
- */
-public class NaturalIdTest extends FunctionalTestCase {
-	
-	public NaturalIdTest(String str) {
-		super(str);
-	}
-
-	public String[] getMappings() {
-		return new String[] { "naturalid/User.hbm.xml" };
-	}
-
-	public void configure(Configuration cfg) {
-		cfg.setProperty(Environment.USE_SECOND_LEVEL_CACHE, "true");
-		cfg.setProperty(Environment.USE_QUERY_CACHE, "true");
-		cfg.setProperty(Environment.GENERATE_STATISTICS, "true");
-	}
-
-	public static Test suite() {
-		return new FunctionalTestClassTestSuite( NaturalIdTest.class );
-	}
-	
-	public void testNaturalIdCheck() throws Exception {
-		Session s = openSession();
-		Transaction t = s.beginTransaction();
-		
-		User u = new User("gavin", "hb", "secret");
-		s.persist(u);
-		Field name = u.getClass().getDeclaredField("name");
-		name.setAccessible(true);
-		name.set(u, "Gavin");
-		try {
-			s.flush();
-			fail();
-		}
-		catch (HibernateException he) {}
-		name.set(u, "gavin");
-		s.delete(u);
-		t.commit();
-		s.close();
-	}
-	
-	public void testNonexistentNaturalIdCache() {
-		getSessions().getStatistics().clear();
-
-		Session s = openSession();
-		Transaction t = s.beginTransaction();
-		
-		Object nullUser = s.createCriteria(User.class)
-			.add( Restrictions.naturalId()
-				.set("name", "gavin")
-				.set("org", "hb") 
-			)
-			.setCacheable(true)
-			.uniqueResult();
-		
-		assertNull(nullUser);
-	
-		t.commit();
-		s.close();
-	
-		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 1 );
-		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 0 );
-		assertEquals( getSessions().getStatistics().getQueryCachePutCount(), 0 );
-		
-		s = openSession();
-		t = s.beginTransaction();
-		
-		User u = new User("gavin", "hb", "secret");
-		s.persist(u);
-		
-		t.commit();
-		s.close();
-		
-		getSessions().getStatistics().clear();
-
-		s = openSession();
-		t = s.beginTransaction();
-		
-		u = (User) s.createCriteria(User.class)
-			.add( Restrictions.naturalId()
-				.set("name", "gavin")
-				.set("org", "hb") 
-			)
-			.setCacheable(true)
-			.uniqueResult();
-		
-		assertNotNull(u);
-		
-		t.commit();
-		s.close();
-
-		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 1 );
-		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 0 );
-		assertEquals( getSessions().getStatistics().getQueryCachePutCount(), 1 );
-		
-		getSessions().getStatistics().clear();
-
-		s = openSession();
-		t = s.beginTransaction();
-		
-		u = (User) s.createCriteria(User.class)
-			.add( Restrictions.naturalId()
-				.set("name", "gavin")
-				.set("org", "hb") 
-			).setCacheable(true)
-			.uniqueResult();
-		
-		s.delete(u);
-		
-		t.commit();
-		s.close();
-		
-		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 0 );
-		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 1 );
-
-		getSessions().getStatistics().clear();
-
-		s = openSession();
-		t = s.beginTransaction();
-		
-		nullUser = s.createCriteria(User.class)
-			.add( Restrictions.naturalId()
-				.set("name", "gavin")
-				.set("org", "hb") 
-			)
-			.setCacheable(true)
-			.uniqueResult();
-		
-		assertNull(nullUser);
-	
-		t.commit();
-		s.close();
-	
-		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 1 );
-		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 0 );
-		assertEquals( getSessions().getStatistics().getQueryCachePutCount(), 0 );
-		
-	}
-
-	public void testNaturalIdCache() {
-		Session s = openSession();
-		Transaction t = s.beginTransaction();
-		
-		User u = new User("gavin", "hb", "secret");
-		s.persist(u);
-		
-		t.commit();
-		s.close();
-		
-		getSessions().getStatistics().clear();
-
-		s = openSession();
-		t = s.beginTransaction();
-		
-		u = (User) s.createCriteria(User.class)
-			.add( Restrictions.naturalId()
-				.set("name", "gavin")
-				.set("org", "hb") 
-			)
-			.setCacheable(true)
-			.uniqueResult();
-		
-		assertNotNull(u);
-		
-		t.commit();
-		s.close();
-
-		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 1 );
-		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 0 );
-		assertEquals( getSessions().getStatistics().getQueryCachePutCount(), 1 );
-		
-		s = openSession();
-		t = s.beginTransaction();
-		
-		User v = new User("xam", "hb", "foobar");
-		s.persist(v);
-		
-		t.commit();
-		s.close();
-		
-		getSessions().getStatistics().clear();
-
-		s = openSession();
-		t = s.beginTransaction();
-		
-		u = (User) s.createCriteria(User.class)
-			.add( Restrictions.naturalId()
-				.set("name", "gavin")
-				.set("org", "hb") 
-			).setCacheable(true)
-			.uniqueResult();
-		
-		assertNotNull(u);
-		
-		t.commit();
-		s.close();
-		
-		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 0 );
-		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 1 );
-
-		s = openSession();
-		t = s.beginTransaction();
-		s.createQuery("delete User").executeUpdate();
-		t.commit();
-		s.close();
-	}
-
-	public void testQuerying() throws Exception {
-		Session s = openSession();
-		Transaction t = s.beginTransaction();
-
-		User u = new User("emmanuel", "hb", "bh");
-		s.persist(u);
-
-		t.commit();
-		s.close();
-
-		s = openSession();
-		t = s.beginTransaction();
-
-		u = (User) s.createQuery( "from User u where u.name = :name" )
-			.setParameter( "name", "emmanuel" ).uniqueResult();
-		assertEquals( "emmanuel", u.getName() );
-		s.delete( u );
-
-		t.commit();
-		s.close();
-	}
-}
-

Deleted: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/User.hbm.xml
===================================================================
--- branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/User.hbm.xml	2007-06-06 21:33:10 UTC (rev 11644)
+++ branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/User.hbm.xml	2007-06-06 21:33:31 UTC (rev 11645)
@@ -1,27 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC 
-	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
-	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-
-<!--
-
-  This mapping illustrates use of <natural-id>.
-  
--->
-
-<hibernate-mapping 
-	package="org.hibernate.test.naturalid"
-	default-access="field">
-	
-	<class name="User" table="SystemUserInfo">
-		<id name="id">
-			<generator class="increment"/>
-		</id>
-		<natural-id>
-			<property name="name"/>
-			<property name="org"/>
-		</natural-id>
-		<property name="password"/>
-	</class>
-	
-</hibernate-mapping>
\ No newline at end of file

Deleted: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/User.java
===================================================================
--- branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/User.java	2007-06-06 21:33:10 UTC (rev 11644)
+++ branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/User.java	2007-06-06 21:33:31 UTC (rev 11645)
@@ -1,34 +0,0 @@
-//$Id$
-package org.hibernate.test.naturalid;
-
-/**
- * @author Gavin King
- */
-public class User {
-	
-	private Long id;
-	private String name;
-	private String org;
-	private String password;
-	
-	User() {}
-
-	public User(String name, String org, String password) {
-		this.name = name;
-		this.org = org;
-		this.password = password;
-	}
-
-	public String getName() {
-		return name;
-	}
-
-	public void setPassword(String password) {
-		this.password = password;
-	}
-
-	public String getOrg() {
-		return org;
-	}
-	
-}

Added: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/immutable/ImmutableNaturalIdTest.java
===================================================================
--- branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/immutable/ImmutableNaturalIdTest.java	                        (rev 0)
+++ branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/immutable/ImmutableNaturalIdTest.java	2007-06-06 21:33:31 UTC (rev 11645)
@@ -0,0 +1,57 @@
+package org.hibernate.test.naturalid.immutable;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.junit.functional.FunctionalTestCase;
+import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class ImmutableNaturalIdTest extends FunctionalTestCase {
+	public ImmutableNaturalIdTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "naturalid/immutable/User.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( ImmutableNaturalIdTest.class );
+	}
+
+	public void testUpdate() {
+		// prepare some test data...
+		Session session = openSession();
+    	session.beginTransaction();
+	  	User user = new User();
+    	user.setUserName( "steve" );
+    	user.setEmail( "steve at hibernate.org" );
+    	user.setFirstName( "Steve" );
+    	user.setInitial( null);
+    	user.setLastName( "Ebersole" );
+    	user.setPassword( "brewhaha" );
+		session.save( user );
+    	session.getTransaction().commit();
+    	session.close();
+
+		// 'user' is now a detached entity, so lets change a property and reattch...
+		user.setPassword( "homebrew" );
+		session = openSession();
+		session.beginTransaction();
+		session.update( user );
+		session.getTransaction().commit();
+		session.close();
+
+		// clean up
+		session = openSession();
+		session.beginTransaction();
+		session.delete( user );
+		session.getTransaction().commit();
+		session.close();
+	}
+}

Added: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/immutable/User.hbm.xml
===================================================================
--- branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/immutable/User.hbm.xml	                        (rev 0)
+++ branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/immutable/User.hbm.xml	2007-06-06 21:33:31 UTC (rev 11645)
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.naturalid.immutable">
+
+	<class name="User" table="IMM_NAT_ID_USER" lazy="true">
+        <comment>Users may bid for or sell auction items.</comment>
+        <id name="myUserId" type="java.lang.Integer">
+            <generator class="increment"/>
+        </id>
+        <natural-id mutable="false">
+            <property name="userName" length="10"/>
+        </natural-id>
+        <version name="version"/>
+        <property name="password" not-null="true" length="15" column="`password`"/>
+        <property name="email"/>
+        <property name="firstName" length="50" not-null="true"/>
+        <property name="initial" column="`initial`"/>
+        <property name="lastName" length="50" not-null="true"/>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file

Added: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/immutable/User.java
===================================================================
--- branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/immutable/User.java	                        (rev 0)
+++ branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/immutable/User.java	2007-06-06 21:33:31 UTC (rev 11645)
@@ -0,0 +1,86 @@
+package org.hibernate.test.naturalid.immutable;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class User implements java.io.Serializable {
+
+	private Integer myUserId;
+	private Integer version;
+	private String userName;
+	private String password;
+	private String email;
+	private String firstName;
+	private Character initial;
+	private String lastName;
+
+	public User() {
+	}
+
+	public Integer getMyUserId() {
+		return this.myUserId;
+	}
+
+	public void setMyUserId(Integer myUserId) {
+		this.myUserId = myUserId;
+	}
+
+	public String getUserName() {
+		return this.userName;
+	}
+
+	public void setUserName(String userName) {
+		this.userName = userName;
+	}
+
+	public String getPassword() {
+		return this.password;
+	}
+
+	public void setPassword(String password) {
+		this.password = password;
+	}
+
+	public String getEmail() {
+		return this.email;
+	}
+
+	public void setEmail(String email) {
+		this.email = email;
+	}
+
+	public String getFirstName() {
+		return this.firstName;
+	}
+
+	public void setFirstName(String firstName) {
+		this.firstName = firstName;
+	}
+
+	public Character getInitial() {
+		return this.initial;
+	}
+
+	public void setInitial(Character initial) {
+		this.initial = initial;
+	}
+
+	public String getLastName() {
+		return this.lastName;
+	}
+
+	public void setLastName(String lastName) {
+		this.lastName = lastName;
+	}
+
+	public Integer getVersion() {
+		return this.version;
+	}
+
+	public void setVersion(Integer version) {
+		this.version = version;
+	}
+
+}

Copied: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/mutable/MutableNaturalIdTest.java (from rev 11632, branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/NaturalIdTest.java)
===================================================================
--- branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/mutable/MutableNaturalIdTest.java	                        (rev 0)
+++ branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/mutable/MutableNaturalIdTest.java	2007-06-06 21:33:31 UTC (rev 11645)
@@ -0,0 +1,287 @@
+//$Id$
+package org.hibernate.test.naturalid.mutable;
+
+import java.lang.reflect.Field;
+
+import junit.framework.Test;
+
+import org.hibernate.HibernateException;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.junit.functional.FunctionalTestCase;
+import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class MutableNaturalIdTest extends FunctionalTestCase {
+	
+	public MutableNaturalIdTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "naturalid/mutable/User.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		cfg.setProperty(Environment.USE_SECOND_LEVEL_CACHE, "true");
+		cfg.setProperty(Environment.USE_QUERY_CACHE, "true");
+		cfg.setProperty(Environment.GENERATE_STATISTICS, "true");
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( MutableNaturalIdTest.class );
+	}
+
+	public void testReattachmentNaturalIdCheck() throws Throwable {
+		Session s = openSession();
+		s.beginTransaction();
+		User u = new User( "gavin", "hb", "secret" );
+		s.persist( u );
+		s.getTransaction().commit();
+		s.close();
+
+		Field name = u.getClass().getDeclaredField("name");
+		name.setAccessible(true);
+		name.set(u, "Gavin");
+		s = openSession();
+		s.beginTransaction();
+		try {
+			s.update( u );
+			s.getTransaction().commit();
+		}
+		catch( HibernateException expected ) {
+			s.getTransaction().rollback();
+		}
+		catch( Throwable t ) {
+			try {
+				s.getTransaction().rollback();
+			}
+			catch ( Throwable ignore ) {
+			}
+			throw t;
+		}
+		finally {
+			s.close();
+		}
+
+		s = openSession();
+		s.beginTransaction();
+		s.delete( u );
+		s.getTransaction().commit();
+		s.close();
+	}
+	
+	public void testNaturalIdCheck() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		
+		User u = new User("gavin", "hb", "secret");
+		s.persist(u);
+		Field name = u.getClass().getDeclaredField("name");
+		name.setAccessible(true);
+		name.set(u, "Gavin");
+		try {
+			s.flush();
+			fail();
+		}
+		catch (HibernateException he) {}
+		name.set(u, "gavin");
+		s.delete(u);
+		t.commit();
+		s.close();
+	}
+	
+	public void testNonexistentNaturalIdCache() {
+		getSessions().getStatistics().clear();
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		
+		Object nullUser = s.createCriteria(User.class)
+			.add( Restrictions.naturalId()
+				.set("name", "gavin")
+				.set("org", "hb") 
+			)
+			.setCacheable(true)
+			.uniqueResult();
+		
+		assertNull(nullUser);
+	
+		t.commit();
+		s.close();
+	
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 1 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryCachePutCount(), 0 );
+		
+		s = openSession();
+		t = s.beginTransaction();
+		
+		User u = new User("gavin", "hb", "secret");
+		s.persist(u);
+		
+		t.commit();
+		s.close();
+		
+		getSessions().getStatistics().clear();
+
+		s = openSession();
+		t = s.beginTransaction();
+		
+		u = (User) s.createCriteria(User.class)
+			.add( Restrictions.naturalId()
+				.set("name", "gavin")
+				.set("org", "hb") 
+			)
+			.setCacheable(true)
+			.uniqueResult();
+		
+		assertNotNull(u);
+		
+		t.commit();
+		s.close();
+
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 1 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryCachePutCount(), 1 );
+		
+		getSessions().getStatistics().clear();
+
+		s = openSession();
+		t = s.beginTransaction();
+		
+		u = (User) s.createCriteria(User.class)
+			.add( Restrictions.naturalId()
+				.set("name", "gavin")
+				.set("org", "hb") 
+			).setCacheable(true)
+			.uniqueResult();
+		
+		s.delete(u);
+		
+		t.commit();
+		s.close();
+		
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 1 );
+
+		getSessions().getStatistics().clear();
+
+		s = openSession();
+		t = s.beginTransaction();
+		
+		nullUser = s.createCriteria(User.class)
+			.add( Restrictions.naturalId()
+				.set("name", "gavin")
+				.set("org", "hb") 
+			)
+			.setCacheable(true)
+			.uniqueResult();
+		
+		assertNull(nullUser);
+	
+		t.commit();
+		s.close();
+	
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 1 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryCachePutCount(), 0 );
+		
+	}
+
+	public void testNaturalIdCache() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		
+		User u = new User("gavin", "hb", "secret");
+		s.persist(u);
+		
+		t.commit();
+		s.close();
+		
+		getSessions().getStatistics().clear();
+
+		s = openSession();
+		t = s.beginTransaction();
+		
+		u = (User) s.createCriteria(User.class)
+			.add( Restrictions.naturalId()
+				.set("name", "gavin")
+				.set("org", "hb") 
+			)
+			.setCacheable(true)
+			.uniqueResult();
+		
+		assertNotNull(u);
+		
+		t.commit();
+		s.close();
+
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 1 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryCachePutCount(), 1 );
+		
+		s = openSession();
+		t = s.beginTransaction();
+		
+		User v = new User("xam", "hb", "foobar");
+		s.persist(v);
+		
+		t.commit();
+		s.close();
+		
+		getSessions().getStatistics().clear();
+
+		s = openSession();
+		t = s.beginTransaction();
+		
+		u = (User) s.createCriteria( User.class)
+			.add( Restrictions.naturalId()
+				.set("name", "gavin")
+				.set("org", "hb") 
+			).setCacheable(true)
+			.uniqueResult();
+		
+		assertNotNull(u);
+		
+		t.commit();
+		s.close();
+		
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 1 );
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery("delete User").executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+	public void testQuerying() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		User u = new User("emmanuel", "hb", "bh");
+		s.persist(u);
+
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+
+		u = (User) s.createQuery( "from User u where u.name = :name" )
+			.setParameter( "name", "emmanuel" ).uniqueResult();
+		assertEquals( "emmanuel", u.getName() );
+		s.delete( u );
+
+		t.commit();
+		s.close();
+	}
+}
+


Property changes on: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/mutable/MutableNaturalIdTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native

Copied: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/mutable/User.hbm.xml (from rev 11632, branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/User.hbm.xml)
===================================================================
--- branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/mutable/User.hbm.xml	                        (rev 0)
+++ branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/mutable/User.hbm.xml	2007-06-06 21:33:31 UTC (rev 11645)
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+  This mapping illustrates use of <natural-id>.
+  
+-->
+
+<hibernate-mapping 
+	package="org.hibernate.test.naturalid"
+	default-access="field">
+	
+	<class name="org.hibernate.test.naturalid.mutable.User" table="SystemUserInfo">
+		<id name="id">
+			<generator class="increment"/>
+		</id>
+		<natural-id>
+			<property name="name"/>
+			<property name="org"/>
+		</natural-id>
+		<property name="password"/>
+	</class>
+	
+</hibernate-mapping>
\ No newline at end of file


Property changes on: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/mutable/User.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native

Copied: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/mutable/User.java (from rev 11632, branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/User.java)
===================================================================
--- branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/mutable/User.java	                        (rev 0)
+++ branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/mutable/User.java	2007-06-06 21:33:31 UTC (rev 11645)
@@ -0,0 +1,34 @@
+//$Id$
+package org.hibernate.test.naturalid.mutable;
+
+/**
+ * @author Gavin King
+ */
+public class User {
+	
+	private Long id;
+	private String name;
+	private String org;
+	private String password;
+	
+	User() {}
+
+	public User(String name, String org, String password) {
+		this.name = name;
+		this.org = org;
+		this.password = password;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setPassword(String password) {
+		this.password = password;
+	}
+
+	public String getOrg() {
+		return org;
+	}
+	
+}


Property changes on: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/naturalid/mutable/User.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native




More information about the hibernate-commits mailing list