[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