You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by hl...@apache.org on 2014/02/07 20:22:13 UTC

[2/2] git commit: TAP5-2284: The Hibernate ENTITY session persistent strategy should store transient entities as-is

TAP5-2284: The Hibernate ENTITY session persistent strategy should store transient entities as-is


Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo
Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/c83d91bc
Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/c83d91bc
Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/c83d91bc

Branch: refs/heads/master
Commit: c83d91bca2c64895d5d69efe8b6f89e8dba1fa59
Parents: 1a54c61
Author: Howard M. Lewis Ship <hl...@apache.org>
Authored: Fri Feb 7 14:21:41 2014 -0500
Committer: Howard M. Lewis Ship <hl...@apache.org>
Committed: Fri Feb 7 14:21:41 2014 -0500

----------------------------------------------------------------------
 ...tityApplicationStatePersistenceStrategy.java | 42 +++++----------
 .../EntityPersistentFieldStrategy.java          | 20 ++++---
 .../internal/hibernate/PersistedEntity.java     | 16 +++---
 .../hibernate/PersistedTransientEntity.java     | 40 ++++++++++++++
 .../internal/hibernate/SessionRestorable.java   | 30 +++++++++++
 .../TapestryHibernateIntegrationTests.java      | 25 +++++----
 .../EntityPersistentFieldStrategyTest.java      | 56 ++++++++++++++++++--
 .../org/example/app0/pages/PersistEntity.java   |  7 +--
 .../java/org/example/app0/pages/SSOEntity.java  | 15 ++----
 .../src/test/webapp/PersistEntity.tml           |  1 -
 .../src/test/webapp/SSOEntity.tml               |  1 -
 11 files changed, 177 insertions(+), 76 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/c83d91bc/tapestry-hibernate/src/main/java/org/apache/tapestry5/internal/hibernate/EntityApplicationStatePersistenceStrategy.java
----------------------------------------------------------------------
diff --git a/tapestry-hibernate/src/main/java/org/apache/tapestry5/internal/hibernate/EntityApplicationStatePersistenceStrategy.java b/tapestry-hibernate/src/main/java/org/apache/tapestry5/internal/hibernate/EntityApplicationStatePersistenceStrategy.java
index f6a4eaa..82d1f47 100644
--- a/tapestry-hibernate/src/main/java/org/apache/tapestry5/internal/hibernate/EntityApplicationStatePersistenceStrategy.java
+++ b/tapestry-hibernate/src/main/java/org/apache/tapestry5/internal/hibernate/EntityApplicationStatePersistenceStrategy.java
@@ -17,9 +17,7 @@ package org.apache.tapestry5.internal.hibernate;
 import org.apache.tapestry5.internal.services.SessionApplicationStatePersistenceStrategy;
 import org.apache.tapestry5.services.ApplicationStateCreator;
 import org.apache.tapestry5.services.Request;
-import org.hibernate.HibernateException;
-
-import java.io.Serializable;
+import org.hibernate.Session;
 
 /**
  * Persists Hibernate entities as SSOs by storing their primary key in the {@link org.apache.tapestry5.services.Session}.
@@ -29,12 +27,13 @@ import java.io.Serializable;
 public class EntityApplicationStatePersistenceStrategy extends SessionApplicationStatePersistenceStrategy
 {
 
-    private final org.hibernate.Session hibernateSession;
+    private final EntityPersistentFieldStrategy delegate;
 
-    public EntityApplicationStatePersistenceStrategy(Request request, org.hibernate.Session hibernateSession)
+    public EntityApplicationStatePersistenceStrategy(Request request, Session hibernateSession)
     {
         super(request);
-        this.hibernateSession = hibernateSession;
+
+        delegate = new EntityPersistentFieldStrategy(hibernateSession, null);
     }
 
     @SuppressWarnings("unchecked")
@@ -42,13 +41,11 @@ public class EntityApplicationStatePersistenceStrategy extends SessionApplicatio
     {
         final Object persistedValue = getOrCreate(ssoClass, creator);
 
-        if (persistedValue instanceof PersistedEntity)
+        if (persistedValue instanceof SessionRestorable)
         {
-            final PersistedEntity persisted = (PersistedEntity) persistedValue;
-
-            Object restored = persisted.restore(this.hibernateSession);
+            Object restored = delegate.convertPersistedToApplicationValue(persistedValue);
 
-            //shall we maybe throw an exception instead?
+            // Maybe throw an exception instead?
             if (restored == null)
             {
                 set(ssoClass, null);
@@ -64,27 +61,16 @@ public class EntityApplicationStatePersistenceStrategy extends SessionApplicatio
     public <T> void set(Class<T> ssoClass, T sso)
     {
         final String key = buildKey(ssoClass);
-        Object entity;
 
-        if (sso != null)
+        if (sso == null)
         {
-            try
-            {
-                final String entityName = this.hibernateSession.getEntityName(sso);
-                final Serializable id = this.hibernateSession.getIdentifier(sso);
-
-                entity = new PersistedEntity(entityName, id);
-            } catch (final HibernateException ex)
-            {
-                // if entity not attached to a Hibernate Session yet, store it as usual sso
-                entity = sso;
-            }
-        } else
-        {
-            entity = sso;
+            getSession().setAttribute(key, null);
+            return;
         }
 
-        getSession().setAttribute(key, entity);
+        Object persistable = delegate.convertApplicationValueToPersisted(sso);
+
+        getSession().setAttribute(key, persistable);
     }
 
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/c83d91bc/tapestry-hibernate/src/main/java/org/apache/tapestry5/internal/hibernate/EntityPersistentFieldStrategy.java
----------------------------------------------------------------------
diff --git a/tapestry-hibernate/src/main/java/org/apache/tapestry5/internal/hibernate/EntityPersistentFieldStrategy.java b/tapestry-hibernate/src/main/java/org/apache/tapestry5/internal/hibernate/EntityPersistentFieldStrategy.java
index d651352..5be27af 100644
--- a/tapestry-hibernate/src/main/java/org/apache/tapestry5/internal/hibernate/EntityPersistentFieldStrategy.java
+++ b/tapestry-hibernate/src/main/java/org/apache/tapestry5/internal/hibernate/EntityPersistentFieldStrategy.java
@@ -1,4 +1,4 @@
-// Copyright 2008m 2913 The Apache Software Foundation
+// Copyright 2008-2014 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -40,24 +40,32 @@ public class EntityPersistentFieldStrategy extends AbstractSessionPersistentFiel
     @Override
     protected Object convertApplicationValueToPersisted(Object newValue)
     {
+        assert newValue != null;
+
+        if (!session.contains(newValue))
+        {
+            return new PersistedTransientEntity(newValue);
+        }
+
         try
         {
             String entityName = session.getEntityName(newValue);
             Serializable id = session.getIdentifier(newValue);
 
             return new PersistedEntity(entityName, id);
-        }
-        catch (HibernateException ex)
+        } catch (HibernateException ex)
         {
-            throw new IllegalArgumentException(String.format("Failed persisting an entity in the session. Only entities attached to a Hibernate Session can be persisted. entity: %s", newValue), ex);
+            throw new IllegalArgumentException(String.format("Failed persisting an entity in the session. entity: %s", newValue), ex);
         }
     }
 
     @Override
     protected Object convertPersistedToApplicationValue(Object persistedValue)
     {
-        PersistedEntity persisted = (PersistedEntity) persistedValue;
+        assert persistedValue != null;
+
+        SessionRestorable persisted = (SessionRestorable) persistedValue;
 
-        return persisted.restore(session);
+        return persisted.restoreWithSession(session);
     }
 }

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/c83d91bc/tapestry-hibernate/src/main/java/org/apache/tapestry5/internal/hibernate/PersistedEntity.java
----------------------------------------------------------------------
diff --git a/tapestry-hibernate/src/main/java/org/apache/tapestry5/internal/hibernate/PersistedEntity.java b/tapestry-hibernate/src/main/java/org/apache/tapestry5/internal/hibernate/PersistedEntity.java
index 51d3088..a4d5fb2 100644
--- a/tapestry-hibernate/src/main/java/org/apache/tapestry5/internal/hibernate/PersistedEntity.java
+++ b/tapestry-hibernate/src/main/java/org/apache/tapestry5/internal/hibernate/PersistedEntity.java
@@ -1,4 +1,4 @@
-// Copyright 2008, 2010, 2013 The Apache Software Foundation
+// Copyright 2008-2014 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -15,6 +15,7 @@
 package org.apache.tapestry5.internal.hibernate;
 
 import org.apache.tapestry5.annotations.ImmutableSessionPersistedObject;
+import org.apache.tapestry5.ioc.internal.util.InternalUtils;
 import org.hibernate.Session;
 
 import java.io.Serializable;
@@ -23,7 +24,7 @@ import java.io.Serializable;
  * Encapsulates a Hibernate entity name with an entity id.
  */
 @ImmutableSessionPersistedObject
-public class PersistedEntity implements Serializable
+public class PersistedEntity implements SessionRestorable
 {
     private static final long serialVersionUID = 897120520279686518L;
 
@@ -33,19 +34,22 @@ public class PersistedEntity implements Serializable
 
     public PersistedEntity(String entityName, Serializable id)
     {
+        assert InternalUtils.isNonBlank(entityName);
+        assert id != null;
+
         this.entityName = entityName;
         this.id = id;
     }
 
-    public Object restore(Session session)
+    public Object restoreWithSession(Session session)
     {
         try
         {
             return session.get(entityName, id);
-        }
-        catch (Exception ex)
+        } catch (Exception ex)
         {
-            throw new RuntimeException(String.format("Failed to load session-persisted entity %s(%s): %s", entityName, id, ex));
+            throw new RuntimeException(String.format("Failed to load session-persisted entity %s(%s): %s", entityName, id, ex),
+                    ex);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/c83d91bc/tapestry-hibernate/src/main/java/org/apache/tapestry5/internal/hibernate/PersistedTransientEntity.java
----------------------------------------------------------------------
diff --git a/tapestry-hibernate/src/main/java/org/apache/tapestry5/internal/hibernate/PersistedTransientEntity.java b/tapestry-hibernate/src/main/java/org/apache/tapestry5/internal/hibernate/PersistedTransientEntity.java
new file mode 100644
index 0000000..78977b0
--- /dev/null
+++ b/tapestry-hibernate/src/main/java/org/apache/tapestry5/internal/hibernate/PersistedTransientEntity.java
@@ -0,0 +1,40 @@
+// Copyright 2014 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry5.internal.hibernate;
+
+import org.hibernate.Session;
+
+public class PersistedTransientEntity implements SessionRestorable
+{
+    private final Object transientEntity;
+
+    public PersistedTransientEntity(Object transientEntity)
+    {
+        assert transientEntity != null;
+
+        this.transientEntity = transientEntity;
+    }
+
+    public Object restoreWithSession(Session session)
+    {
+        return transientEntity;
+    }
+
+    @Override
+    public String toString()
+    {
+        return String.format("PersistedTransientEntity<%s>", transientEntity);
+    }
+}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/c83d91bc/tapestry-hibernate/src/main/java/org/apache/tapestry5/internal/hibernate/SessionRestorable.java
----------------------------------------------------------------------
diff --git a/tapestry-hibernate/src/main/java/org/apache/tapestry5/internal/hibernate/SessionRestorable.java b/tapestry-hibernate/src/main/java/org/apache/tapestry5/internal/hibernate/SessionRestorable.java
new file mode 100644
index 0000000..c3cf82c
--- /dev/null
+++ b/tapestry-hibernate/src/main/java/org/apache/tapestry5/internal/hibernate/SessionRestorable.java
@@ -0,0 +1,30 @@
+// Copyright 2014 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry5.internal.hibernate;
+
+import org.hibernate.Session;
+
+import java.io.Serializable;
+
+/**
+ * Interface for serializable objects stored in the HTTP Session that can be restored to active state via
+ * the Hibernate {@linkplain org.hibernate.Session}.
+ *
+ * @since 5.4
+ */
+public interface SessionRestorable extends Serializable
+{
+    Object restoreWithSession(Session session);
+}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/c83d91bc/tapestry-hibernate/src/test/java/org/apache/tapestry5/hibernate/integration/TapestryHibernateIntegrationTests.java
----------------------------------------------------------------------
diff --git a/tapestry-hibernate/src/test/java/org/apache/tapestry5/hibernate/integration/TapestryHibernateIntegrationTests.java b/tapestry-hibernate/src/test/java/org/apache/tapestry5/hibernate/integration/TapestryHibernateIntegrationTests.java
index d5f9540..e573704 100644
--- a/tapestry-hibernate/src/test/java/org/apache/tapestry5/hibernate/integration/TapestryHibernateIntegrationTests.java
+++ b/tapestry-hibernate/src/test/java/org/apache/tapestry5/hibernate/integration/TapestryHibernateIntegrationTests.java
@@ -1,4 +1,4 @@
-// Copyright 2008, 2012, 2013 The Apache Software Foundation
+// Copyright 2008-2014 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -15,6 +15,7 @@
 package org.apache.tapestry5.hibernate.integration;
 
 import org.apache.tapestry5.internal.hibernate.PersistedEntity;
+import org.apache.tapestry5.internal.hibernate.PersistedTransientEntity;
 import org.apache.tapestry5.test.SeleniumTestCase;
 import org.apache.tapestry5.test.TapestryTestConfiguration;
 import org.example.app0.entities.User;
@@ -24,6 +25,10 @@ import org.testng.annotations.Test;
 @TapestryTestConfiguration(webAppFolder = "src/test/webapp")
 public class TapestryHibernateIntegrationTests extends SeleniumTestCase
 {
+
+    private final String PERSISTENT_ENTITY_CLASS_NAME = PersistedEntity.class.getName();
+    private final String PERSISTED_TRANSIENT_ENTITY_CLASS_NAME = PersistedTransientEntity.class.getName();
+
     public void valueencode_all_entity_types() throws Exception
     {
         open("/encodeentities");
@@ -60,39 +65,33 @@ public class TapestryHibernateIntegrationTests extends SeleniumTestCase
         assertText("//span[@id='name']", "name");
         clickAndWait("link=delete");
         assertEquals(getText("//span[@id='name']").length(), 0);
-
-        // transient objects cannot be persisted
-        clickAndWait("link=set to transient");
-        assertTextPresent("Error persisting");
     }
 
     public void sso_entities()
     {
         open("/ssoentity");
         assertEquals(getText("//span[@id='name']").length(), 0);
-        assertText("//span[@id='persistedEntityClassName']", User.class.getName());
+        assertText("//span[@id='persistedEntityClassName']", PERSISTED_TRANSIENT_ENTITY_CLASS_NAME);
 
         clickAndWait("link=persist entity");
         assertText("//span[@id='name']", "name");
-        assertText("//span[@id='persistedEntityClassName']", PersistedEntity.class.getName());
+        assertText("//span[@id='persistedEntityClassName']", PERSISTENT_ENTITY_CLASS_NAME);
 
         // can set back to null
         clickAndWait("link=set to null");
         assertEquals(getText("//span[@id='name']").length(), 0);
-        assertText("//span[@id='persistedEntityClassName']", User.class.getName());
+        assertText("//span[@id='persistedEntityClassName']", PERSISTED_TRANSIENT_ENTITY_CLASS_NAME);
 
         clickAndWait("link=persist entity");
         assertText("//span[@id='name']", "name");
-        assertText("//span[@id='persistedEntityClassName']", PersistedEntity.class.getName());
+        assertText("//span[@id='persistedEntityClassName']", PERSISTENT_ENTITY_CLASS_NAME);
         clickAndWait("link=delete");
         assertEquals(getText("//span[@id='name']").length(), 0);
-        assertText("//span[@id='persistedEntityClassName']", User.class.getName());
+        assertText("//span[@id='persistedEntityClassName']", PERSISTED_TRANSIENT_ENTITY_CLASS_NAME);
 
         clickAndWait("link=persist entity");
         assertText("//span[@id='name']", "name");
-        assertText("//span[@id='persistedEntityClassName']", PersistedEntity.class.getName());
-        clickAndWait("link=set to transient");
-        assertText("//span[@id='persistedEntityClassName']", User.class.getName());
+        assertText("//span[@id='persistedEntityClassName']", PERSISTENT_ENTITY_CLASS_NAME);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/c83d91bc/tapestry-hibernate/src/test/java/org/apache/tapestry5/internal/hibernate/EntityPersistentFieldStrategyTest.java
----------------------------------------------------------------------
diff --git a/tapestry-hibernate/src/test/java/org/apache/tapestry5/internal/hibernate/EntityPersistentFieldStrategyTest.java b/tapestry-hibernate/src/test/java/org/apache/tapestry5/internal/hibernate/EntityPersistentFieldStrategyTest.java
index 3b9b008..5bd2e91 100644
--- a/tapestry-hibernate/src/test/java/org/apache/tapestry5/internal/hibernate/EntityPersistentFieldStrategyTest.java
+++ b/tapestry-hibernate/src/test/java/org/apache/tapestry5/internal/hibernate/EntityPersistentFieldStrategyTest.java
@@ -1,4 +1,4 @@
-// Copyright 2008 The Apache Software Foundation
+// Copyright 2008, 2014 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -28,6 +28,7 @@ public class EntityPersistentFieldStrategyTest extends TapestryTestCase
         Session session = newMock(Session.class);
         EntityPersistentFieldStrategy strategy = new EntityPersistentFieldStrategy(session, null);
 
+        expect(session.contains(nonEntity)).andReturn(true);
         expect(session.getEntityName(nonEntity)).andThrow(new HibernateException("error"));
 
         replay();
@@ -37,12 +38,59 @@ public class EntityPersistentFieldStrategyTest extends TapestryTestCase
             strategy.postChange("pageName", "", "fieldName", nonEntity);
 
             unreachable();
-        }
-        catch (IllegalArgumentException ex)
+        } catch (IllegalArgumentException ex)
         {
-            assertEquals(ex.getMessage(), "Failed persisting an entity in the session. Only entities attached to a Hibernate Session can be persisted. entity: foo");
+            assertEquals(ex.getMessage(), "Failed persisting an entity in the session. entity: foo");
         }
 
         verify();
     }
+
+    public void transient_entity()
+    {
+        SampleEntity entity = new SampleEntity();
+        Session session = newMock(Session.class);
+        EntityPersistentFieldStrategy strategy = new EntityPersistentFieldStrategy(session, null);
+
+        expect(session.contains(entity)).andReturn(false);
+
+        replay();
+
+        Object persisted = strategy.convertApplicationValueToPersisted(entity);
+
+        assert persisted instanceof SessionRestorable;
+
+        Object restored = strategy.convertPersistedToApplicationValue(persisted);
+
+        assertSame(entity, restored);
+
+        verify();
+    }
+
+    public void persistent_entity()
+    {
+        SampleEntity entity = new SampleEntity();
+        SampleEntity restoredEntity = new SampleEntity();
+        Session session = newMock(Session.class);
+        EntityPersistentFieldStrategy strategy = new EntityPersistentFieldStrategy(session, null);
+
+        expect(session.contains(entity)).andReturn(true);
+        expect(session.getEntityName(entity)).andReturn("SampleEntity");
+        expect(session.getIdentifier(entity)).andReturn(42);
+
+        expect(session.get("SampleEntity", 42)).andReturn(restoredEntity);
+
+        replay();
+
+        Object persisted = strategy.convertApplicationValueToPersisted(entity);
+
+        assert persisted instanceof SessionRestorable;
+
+        Object restored = strategy.convertPersistedToApplicationValue(persisted);
+
+        assertSame(restored, restoredEntity);
+
+        verify();
+
+    }
 }

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/c83d91bc/tapestry-hibernate/src/test/java/org/example/app0/pages/PersistEntity.java
----------------------------------------------------------------------
diff --git a/tapestry-hibernate/src/test/java/org/example/app0/pages/PersistEntity.java b/tapestry-hibernate/src/test/java/org/example/app0/pages/PersistEntity.java
index 50cc55a..484f666 100644
--- a/tapestry-hibernate/src/test/java/org/example/app0/pages/PersistEntity.java
+++ b/tapestry-hibernate/src/test/java/org/example/app0/pages/PersistEntity.java
@@ -1,4 +1,4 @@
-// Copyright 2008 The Apache Software Foundation
+// Copyright 2008-2014 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -56,11 +56,6 @@ public class PersistEntity
         // No commit, so no real change.
     }
 
-    void onSetToTransient()
-    {
-        user = new User();
-    }
-
     void onSetToNull()
     {
         user = null;

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/c83d91bc/tapestry-hibernate/src/test/java/org/example/app0/pages/SSOEntity.java
----------------------------------------------------------------------
diff --git a/tapestry-hibernate/src/test/java/org/example/app0/pages/SSOEntity.java b/tapestry-hibernate/src/test/java/org/example/app0/pages/SSOEntity.java
index be2047c..b59f6fa 100644
--- a/tapestry-hibernate/src/test/java/org/example/app0/pages/SSOEntity.java
+++ b/tapestry-hibernate/src/test/java/org/example/app0/pages/SSOEntity.java
@@ -1,4 +1,4 @@
-// Copyright 2009 The Apache Software Foundation
+// Copyright 2009-2014 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -13,18 +13,16 @@
 // limitations under the License.
 package org.example.app0.pages;
 
-import java.util.List;
-
-import org.apache.tapestry5.annotations.Persist;
 import org.apache.tapestry5.annotations.Property;
 import org.apache.tapestry5.annotations.SessionState;
-import org.apache.tapestry5.internal.hibernate.PersistedEntity;
 import org.apache.tapestry5.ioc.annotations.Inject;
 import org.apache.tapestry5.services.Request;
 import org.apache.tapestry5.services.Session;
 import org.example.app0.entities.User;
 import org.example.app0.services.UserDAO;
 
+import java.util.List;
+
 public class SSOEntity 
 {
     @SessionState
@@ -51,12 +49,7 @@ public class SSOEntity
     {
         user = null;
     }
-    
-    void onSetToTransient()
-    {
-        user = new User();
-    }
-    
+
     void onDelete()
     {
         List<User> users = userDAO.findAll();

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/c83d91bc/tapestry-hibernate/src/test/webapp/PersistEntity.tml
----------------------------------------------------------------------
diff --git a/tapestry-hibernate/src/test/webapp/PersistEntity.tml b/tapestry-hibernate/src/test/webapp/PersistEntity.tml
index 6329cf5..8fba8a6 100644
--- a/tapestry-hibernate/src/test/webapp/PersistEntity.tml
+++ b/tapestry-hibernate/src/test/webapp/PersistEntity.tml
@@ -5,6 +5,5 @@
 	<p><t:eventlink event="changeName">change the name</t:eventlink></p>
 	<p><t:eventlink event="setToNull">set to null</t:eventlink></p>
 	<p><t:eventlink event="delete">delete</t:eventlink></p>
-	<p><t:eventlink event="setToTransient">set to transient</t:eventlink></p>
 </body>
 </html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/c83d91bc/tapestry-hibernate/src/test/webapp/SSOEntity.tml
----------------------------------------------------------------------
diff --git a/tapestry-hibernate/src/test/webapp/SSOEntity.tml b/tapestry-hibernate/src/test/webapp/SSOEntity.tml
index f7b0cf1..f749a25 100644
--- a/tapestry-hibernate/src/test/webapp/SSOEntity.tml
+++ b/tapestry-hibernate/src/test/webapp/SSOEntity.tml
@@ -4,7 +4,6 @@
 	<p>persisted entity class name: <span id="persistedEntityClassName">${persistedEntityClassName}</span></p>
 	<p><t:eventlink event="persistEntity">persist entity</t:eventlink></p>
 	<p><t:eventlink event="setToNull">set to null</t:eventlink></p>
-	<p><t:eventlink event="setToTransient">set to transient</t:eventlink></p>
 	<p><t:eventlink event="delete">delete</t:eventlink></p>
 </body>
 </html>
\ No newline at end of file