[hibernate-commits] Hibernate SVN: r20153 - in core/trunk: testsuite/src/test/java/org/hibernate/test/jpa and 4 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Mon Aug 16 23:28:31 EDT 2010


Author: gbadner
Date: 2010-08-16 23:28:30 -0400 (Mon, 16 Aug 2010)
New Revision: 20153

Added:
   core/trunk/testsuite/src/test/java/org/hibernate/test/jpa/naturalid/
   core/trunk/testsuite/src/test/java/org/hibernate/test/jpa/naturalid/ImmutableNaturalIdTest.java
   core/trunk/testsuite/src/test/java/org/hibernate/test/jpa/naturalid/User.hbm.xml
   core/trunk/testsuite/src/test/java/org/hibernate/test/jpa/naturalid/User.java
Modified:
   core/trunk/core/src/main/java/org/hibernate/cache/StandardQueryCache.java
   core/trunk/testsuite/src/test/java/org/hibernate/test/jpa/AbstractJPATest.java
   core/trunk/testsuite/src/test/java/org/hibernate/test/jpa/proxy/JPAProxyTest.java
   core/trunk/testsuite/src/test/java/org/hibernate/test/naturalid/immutable/ImmutableNaturalIdTest.java
   core/trunk/testsuite/src/test/java/org/hibernate/test/naturalid/mutable/MutableNaturalIdTest.java
Log:
HHH-5180 : StandardQueryCache.get() does not handle EntityNotFoundException for natural key lookups

Modified: core/trunk/core/src/main/java/org/hibernate/cache/StandardQueryCache.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/cache/StandardQueryCache.java	2010-08-16 21:10:23 UTC (rev 20152)
+++ core/trunk/core/src/main/java/org/hibernate/cache/StandardQueryCache.java	2010-08-17 03:28:30 UTC (rev 20153)
@@ -29,6 +29,8 @@
 import java.util.Properties;
 import java.util.Set;
 
+import javax.persistence.EntityNotFoundException;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -156,8 +158,10 @@
 					);
 				}
 			}
-			catch ( UnresolvableObjectException uoe ) {
-				if ( isNaturalKeyLookup ) {
+			catch ( RuntimeException ex ) {
+				if ( isNaturalKeyLookup &&
+						( UnresolvableObjectException.class.isInstance( ex ) ||
+						EntityNotFoundException.class.isInstance( ex ) ) ) {
 					//TODO: not really completely correct, since
 					//      the uoe could occur while resolving
 					//      associations, leaving the PC in an
@@ -167,7 +171,7 @@
 					return null;
 				}
 				else {
-					throw uoe;
+					throw ex;
 				}
 			}
 		}

Modified: core/trunk/testsuite/src/test/java/org/hibernate/test/jpa/AbstractJPATest.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/jpa/AbstractJPATest.java	2010-08-16 21:10:23 UTC (rev 20152)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/jpa/AbstractJPATest.java	2010-08-17 03:28:30 UTC (rev 20153)
@@ -16,6 +16,7 @@
 import org.hibernate.testing.junit.functional.FunctionalTestCase;
 
 import java.io.Serializable;
+import javax.persistence.EntityNotFoundException;
 
 /**
  * An abstract test for all JPA spec related tests.
@@ -53,37 +54,10 @@
 
 	private static class JPAEntityNotFoundDelegate implements EntityNotFoundDelegate {
 		public void handleEntityNotFound(String entityName, Serializable id) {
-			throw new EntityNotFoundException( entityName, id );
+			throw new EntityNotFoundException("Unable to find " + entityName  + " with id " + id);			
 		}
 	}
 
-	/**
-	 * Mimic the JPA EntityNotFoundException.
-	 */
-	public static class EntityNotFoundException extends RuntimeException {
-		private final String entityName;
-		private final Serializable id;
-
-		public EntityNotFoundException(String entityName, Serializable id) {
-			this( "unable to locate specified entity", entityName, id );
-		}
-
-		public EntityNotFoundException(String message, String entityName, Serializable id) {
-			super( message );
-			this.entityName = entityName;
-			this.id = id;
-		}
-
-		public String getEntityName() {
-			return entityName;
-		}
-
-		public Serializable getId() {
-			return id;
-		}
-	}
-
-
 	// mimic specific event aspects of the JPA environment ~~~~~~~~~~~~~~~~~~~~
 
 	protected PersistEventListener[] buildPersistEventListeners() {

Copied: core/trunk/testsuite/src/test/java/org/hibernate/test/jpa/naturalid/ImmutableNaturalIdTest.java (from rev 20151, core/trunk/testsuite/src/test/java/org/hibernate/test/naturalid/immutable/ImmutableNaturalIdTest.java)
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/jpa/naturalid/ImmutableNaturalIdTest.java	                        (rev 0)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/jpa/naturalid/ImmutableNaturalIdTest.java	2010-08-17 03:28:30 UTC (rev 20153)
@@ -0,0 +1,264 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.jpa.naturalid;
+
+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.test.jpa.AbstractJPATest;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ * (copied from org.hibernate.test.naturalid.immutable.ImmutableNaturalIdTest)
+ */
+public class ImmutableNaturalIdTest extends AbstractJPATest {
+	public ImmutableNaturalIdTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "jpa/naturalid/User.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( ImmutableNaturalIdTest.class );
+	}
+
+	public void configure(Configuration cfg) {
+		super.configure( cfg );
+		cfg.setProperty( Environment.USE_SECOND_LEVEL_CACHE, "true" );
+		cfg.setProperty( Environment.USE_QUERY_CACHE, "true" );
+		cfg.setProperty( Environment.GENERATE_STATISTICS, "true" );
+	}
+
+	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.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();
+	}
+
+	public void testNaturalIdCheck() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		User u = new User( "steve", "superSecret" );
+		s.persist( u );
+		u.setUserName( "Steve" );
+		try {
+			s.flush();
+			fail();
+		}
+		catch ( HibernateException he ) {
+		}
+		u.setUserName( "steve" );
+		s.delete( u );
+		t.commit();
+		s.close();
+	}
+
+	public void testNaturalIdCache() {
+		Session s = openSession();
+		s.beginTransaction();
+		User u = new User( "steve", "superSecret" );
+		s.persist( u );
+		s.getTransaction().commit();
+		s.close();
+
+		getSessions().getStatistics().clear();
+
+		s = openSession();
+		s.beginTransaction();
+		u = ( User ) s.createCriteria( User.class )
+				.add( Restrictions.naturalId().set( "userName", "steve" ) )
+				.setCacheable( true )
+				.uniqueResult();
+		assertNotNull( u );
+		s.getTransaction().commit();
+		s.close();
+
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 1 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryCachePutCount(), 1 );
+
+		s = openSession();
+		s.beginTransaction();
+		User v = new User( "gavin", "supsup" );
+		s.persist( v );
+		s.getTransaction().commit();
+		s.close();
+
+		getSessions().getStatistics().clear();
+
+		s = openSession();
+		s.beginTransaction();
+		u = ( User ) s.createCriteria( User.class )
+				.add( Restrictions.naturalId().set( "userName", "steve" ) )
+				.setCacheable( true )
+				.uniqueResult();
+		assertNotNull( u );
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 1 );
+		u = ( User ) s.createCriteria( User.class )
+				.add( Restrictions.naturalId().set( "userName", "steve" ) )
+				.setCacheable( true )
+				.uniqueResult();
+		assertNotNull( u );
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 2 );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.createQuery( "delete User" ).executeUpdate();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testNaturalIdDeleteUsingCache() {
+		Session s = openSession();
+		s.beginTransaction();
+		User u = new User( "steve", "superSecret" );
+		s.persist( u );
+		s.getTransaction().commit();
+		s.close();
+
+		getSessions().getStatistics().clear();
+
+		s = openSession();
+		s.beginTransaction();
+		u = ( User ) s.createCriteria( User.class )
+				.add( Restrictions.naturalId().set( "userName", "steve" ) )
+				.setCacheable( true )
+				.uniqueResult();
+		assertNotNull( u );
+		s.getTransaction().commit();
+		s.close();
+
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 1 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryCachePutCount(), 1 );
+
+		getSessions().getStatistics().clear();
+
+		s = openSession();
+		s.beginTransaction();
+		u = ( User ) s.createCriteria( User.class )
+				.add( Restrictions.naturalId().set( "userName", "steve" ) )
+				.setCacheable( true )
+				.uniqueResult();
+		assertNotNull( u );
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 1 );
+
+		s.delete( u );
+
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		u = ( User ) s.createCriteria( User.class )
+				.add( Restrictions.naturalId().set( "userName", "steve" ) )
+				.setCacheable( true )
+				.uniqueResult();
+		assertNull( u );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testNaturalIdRecreateUsingCache() {
+		testNaturalIdDeleteUsingCache();
+
+		Session s = openSession();
+		s.beginTransaction();
+		User u = new User( "steve", "superSecret" );
+		s.persist( u );
+		s.getTransaction().commit();
+		s.close();
+
+		getSessions().getStatistics().clear();
+
+		s = openSession();
+		s.beginTransaction();
+		u = ( User ) s.createCriteria( User.class )
+				.add( Restrictions.naturalId().set( "userName", "steve" ) )
+				.setCacheable( true )
+				.uniqueResult();
+		assertNotNull( u );
+
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 1 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryCachePutCount(), 1 );
+
+		getSessions().getStatistics().clear();
+
+		s = openSession();
+		s.beginTransaction();
+		u = ( User ) s.createCriteria( User.class )
+				.add( Restrictions.naturalId().set( "userName", "steve" ) )
+				.setCacheable( true )
+				.uniqueResult();
+		assertNotNull( u );
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 1 );
+
+		s.delete( u );
+
+		s.getTransaction().commit();
+		s.close();
+	}
+
+}
\ No newline at end of file

Copied: core/trunk/testsuite/src/test/java/org/hibernate/test/jpa/naturalid/User.hbm.xml (from rev 20151, core/trunk/testsuite/src/test/java/org/hibernate/test/naturalid/immutable/User.hbm.xml)
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/jpa/naturalid/User.hbm.xml	                        (rev 0)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/jpa/naturalid/User.hbm.xml	2010-08-17 03:28:30 UTC (rev 20153)
@@ -0,0 +1,42 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+  ~ Copyright (c) 2007, Red Hat Middleware, LLC. All rights reserved.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, v. 2.1. This program is distributed in the
+  ~ hope that it will be useful, but WITHOUT A WARRANTY; without even the implied
+  ~ warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  ~ Lesser General Public License for more details. You should have received a
+  ~ copy of the GNU Lesser General Public License, v.2.1 along with this
+  ~ distribution; if not, write to the Free Software Foundation, Inc.,
+  ~ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+  ~
+  ~ Red Hat Author(s): Steve Ebersole
+  -->
+
+<!--
+
+  This mapping illustrates use of <natural-id mutable="false"/>
+
+-->
+<hibernate-mapping package="org.hibernate.test.jpa.naturalid">
+
+    <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"/>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file

Copied: core/trunk/testsuite/src/test/java/org/hibernate/test/jpa/naturalid/User.java (from rev 20151, core/trunk/testsuite/src/test/java/org/hibernate/test/naturalid/immutable/User.java)
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/jpa/naturalid/User.java	                        (rev 0)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/jpa/naturalid/User.java	2010-08-17 03:28:30 UTC (rev 20153)
@@ -0,0 +1,89 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.jpa.naturalid;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ * (copied from org.hibernate.test.naturalid.immutable.User)
+ */
+public class User implements java.io.Serializable {
+
+	private Integer myUserId;
+	private Integer version;
+	private String userName;
+	private String password;
+	private String email;
+
+	public User() {
+	}
+
+	public User(String userName, String password) {
+		this.userName = userName;
+		this.password = password;
+	}
+
+	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 Integer getVersion() {
+		return this.version;
+	}
+
+	public void setVersion(Integer version) {
+		this.version = version;
+	}
+
+}
\ No newline at end of file

Modified: core/trunk/testsuite/src/test/java/org/hibernate/test/jpa/proxy/JPAProxyTest.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/jpa/proxy/JPAProxyTest.java	2010-08-16 21:10:23 UTC (rev 20152)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/jpa/proxy/JPAProxyTest.java	2010-08-17 03:28:30 UTC (rev 20153)
@@ -1,5 +1,7 @@
 package org.hibernate.test.jpa.proxy;
 
+import javax.persistence.EntityNotFoundException;
+
 import junit.framework.AssertionFailedError;
 import junit.framework.Test;
 

Modified: core/trunk/testsuite/src/test/java/org/hibernate/test/naturalid/immutable/ImmutableNaturalIdTest.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/naturalid/immutable/ImmutableNaturalIdTest.java	2010-08-16 21:10:23 UTC (rev 20152)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/naturalid/immutable/ImmutableNaturalIdTest.java	2010-08-17 03:28:30 UTC (rev 20153)
@@ -155,4 +155,99 @@
 		s.getTransaction().commit();
 		s.close();
 	}
+
+	public void testNaturalIdDeleteUsingCache() {
+		Session s = openSession();
+		s.beginTransaction();
+		User u = new User( "steve", "superSecret" );
+		s.persist( u );
+		s.getTransaction().commit();
+		s.close();
+
+		getSessions().getStatistics().clear();
+
+		s = openSession();
+		s.beginTransaction();
+		u = ( User ) s.createCriteria( User.class )
+				.add( Restrictions.naturalId().set( "userName", "steve" ) )
+				.setCacheable( true )
+				.uniqueResult();
+		assertNotNull( u );
+		s.getTransaction().commit();
+		s.close();
+
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 1 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryCachePutCount(), 1 );
+
+		getSessions().getStatistics().clear();
+
+		s = openSession();
+		s.beginTransaction();
+		u = ( User ) s.createCriteria( User.class )
+				.add( Restrictions.naturalId().set( "userName", "steve" ) )
+				.setCacheable( true )
+				.uniqueResult();
+		assertNotNull( u );
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 1 );
+
+		s.delete( u );
+
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		u = ( User ) s.createCriteria( User.class )
+				.add( Restrictions.naturalId().set( "userName", "steve" ) )
+				.setCacheable( true )
+				.uniqueResult();
+		assertNull( u );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testNaturalIdRecreateUsingCache() {
+		testNaturalIdDeleteUsingCache();
+
+		Session s = openSession();
+		s.beginTransaction();
+		User u = new User( "steve", "superSecret" );
+		s.persist( u );
+		s.getTransaction().commit();
+		s.close();
+
+		getSessions().getStatistics().clear();
+
+		s = openSession();
+		s.beginTransaction();
+		u = ( User ) s.createCriteria( User.class )
+				.add( Restrictions.naturalId().set( "userName", "steve" ) )
+				.setCacheable( true )
+				.uniqueResult();
+		assertNotNull( u );
+
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 1 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryCachePutCount(), 1 );
+
+		getSessions().getStatistics().clear();
+
+		s = openSession();
+		s.beginTransaction();
+		u = ( User ) s.createCriteria( User.class )
+				.add( Restrictions.naturalId().set( "userName", "steve" ) )
+				.setCacheable( true )
+				.uniqueResult();
+		assertNotNull( u );
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 1 );
+
+		s.delete( u );
+
+		s.getTransaction().commit();
+		s.close();
+	}
+
 }

Modified: core/trunk/testsuite/src/test/java/org/hibernate/test/naturalid/mutable/MutableNaturalIdTest.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/naturalid/mutable/MutableNaturalIdTest.java	2010-08-16 21:10:23 UTC (rev 20152)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/naturalid/mutable/MutableNaturalIdTest.java	2010-08-17 03:28:30 UTC (rev 20153)
@@ -244,6 +244,115 @@
 		s.close();
 	}
 
+	public void testNaturalIdDeleteUsingCache() {
+		Session s = openSession();
+		s.beginTransaction();
+		User u = new User( "steve", "hb", "superSecret" );
+		s.persist( u );
+		s.getTransaction().commit();
+		s.close();
+
+		getSessions().getStatistics().clear();
+
+		s = openSession();
+		s.beginTransaction();
+		u = ( User ) s.createCriteria( User.class )
+				.add( Restrictions.naturalId()
+						.set("name", "steve")
+						.set("org", "hb")
+				)
+				.setCacheable( true )
+				.uniqueResult();
+		assertNotNull( u );
+		s.getTransaction().commit();
+		s.close();
+
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 1 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryCachePutCount(), 1 );
+
+		getSessions().getStatistics().clear();
+
+		s = openSession();
+		s.beginTransaction();
+		u = ( User ) s.createCriteria( User.class )
+				.add( Restrictions.naturalId()
+						.set("name", "steve")
+						.set("org", "hb")
+				)
+				.setCacheable( true )
+				.uniqueResult();
+		assertNotNull( u );
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 1 );
+
+		s.delete( u );
+
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		u = ( User ) s.createCriteria( User.class )
+				.add( Restrictions.naturalId()
+						.set("name", "steve")
+						.set("org", "hb")
+				)
+				.setCacheable( true )
+				.uniqueResult();
+		assertNull( u );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testNaturalIdRecreateUsingCache() {
+		testNaturalIdDeleteUsingCache();
+
+		Session s = openSession();
+		s.beginTransaction();
+		User u = new User( "steve", "hb", "superSecret" );
+		s.persist( u );
+		s.getTransaction().commit();
+		s.close();
+
+		getSessions().getStatistics().clear();
+
+		s = openSession();
+		s.beginTransaction();
+		u = ( User ) s.createCriteria( User.class )
+				.add( Restrictions.naturalId()
+						.set("name", "steve")
+						.set("org", "hb")
+				)
+				.setCacheable( true )
+				.uniqueResult();
+		assertNotNull( u );
+
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 1 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryCachePutCount(), 1 );
+
+		getSessions().getStatistics().clear();
+
+		s = openSession();
+		s.beginTransaction();
+		u = ( User ) s.createCriteria( User.class )
+				.add( Restrictions.naturalId()
+						.set("name", "steve")
+						.set("org", "hb")
+				)
+				.setCacheable( true )
+				.uniqueResult();
+		assertNotNull( u );
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 1 );
+
+		s.delete( u );
+
+		s.getTransaction().commit();
+		s.close();
+	}
+
 	public void testQuerying() throws Exception {
 		Session s = openSession();
 		Transaction t = s.beginTransaction();



More information about the hibernate-commits mailing list