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 2008/04/05 17:06:12 UTC

svn commit: r645113 - in /tapestry/tapestry5/trunk: tapestry-hibernate/src/main/java/org/apache/tapestry/internal/hibernate/ tapestry-hibernate/src/site/apt/ tapestry-hibernate/src/test/java/org/example/app0/pages/ tapestry-hibernate/src/test/java/org/...

Author: hlship
Date: Sat Apr  5 08:06:11 2008
New Revision: 645113

URL: http://svn.apache.org/viewvc?rev=645113&view=rev
Log:
TAPESTRY-2247: Transactions should roll back, not commit, at the end of each request

Removed:
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/annotations/Inject.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/annotations/InjectService.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/annotations/IntermediateType.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/annotations/Primary.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/annotations/Symbol.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/annotations/Value.java
Modified:
    tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/internal/hibernate/HibernateSessionManagerImpl.java
    tapestry/tapestry5/trunk/tapestry-hibernate/src/site/apt/userguide.apt
    tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/example/app0/pages/CachedForm.java
    tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/example/app0/pages/EncodeEntities.java
    tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/example/app0/pages/PersistEntity.java
    tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/example/app0/services/AppModule.java

Modified: tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/internal/hibernate/HibernateSessionManagerImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/internal/hibernate/HibernateSessionManagerImpl.java?rev=645113&r1=645112&r2=645113&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/internal/hibernate/HibernateSessionManagerImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/internal/hibernate/HibernateSessionManagerImpl.java Sat Apr  5 08:06:11 2008
@@ -51,12 +51,13 @@
     }
 
     /**
-     * Commits the transaction at the end of the request, then closes the session. The transaction commit should largely
-     * be a no-op, since it's expected that {@link #commit()} will have been invoked after any real changes.
+     * Rollsback the transaction at the end of the request, then closes the session. This means that any uncommitted
+     * changes are lost; code should inject the HSM and invoke {@link #commit()} after making any changes, if they
+     * should persist.
      */
     public void threadDidCleanup()
     {
-        _transaction.commit();
+        _transaction.rollback();
 
         _session.close();
     }

Modified: tapestry/tapestry5/trunk/tapestry-hibernate/src/site/apt/userguide.apt
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-hibernate/src/site/apt/userguide.apt?rev=645113&r1=645112&r2=645113&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-hibernate/src/site/apt/userguide.apt (original)
+++ tapestry/tapestry5/trunk/tapestry-hibernate/src/site/apt/userguide.apt Sat Apr  5 08:06:11 2008
@@ -9,7 +9,8 @@
   the following example:
   
 +----+
-public class ViewPerson {
+public class ViewPerson
+{
   @Property
   private Person _person;
   
@@ -40,7 +41,8 @@
   If you wish to persist an entity in the session, you may use the "entity" persistence strategy:
   
 +----+
-public class ViewPerson {
+public class ViewPerson
+{
   @Persist("entity")
   @Property
   private Person _person;
@@ -55,3 +57,43 @@
   
   This persistence strategy works with any Hibernate entity that is associated with a valid Hibernate Session by persisting only the id
   of the entity. Notice that no onPassivate() method is needed; when the page renders the entity is loaded by the id stored in the session.
+
+Committing Changes
+
+  All Hibernate operations occur in a transaction, but that transaction is rolledback at the end of each request; thus
+  any changes you make will be <lost> unless the transaction is committed.
+
+  The correct way to commit the transaction is by injecting the HibernateSessionManager service:
+
++----+
+public class EditPerson
+{
+  @Persist("entity")
+  @Property
+  private Person _person;
+
+  @InjectPage
+  private PersonIndex _personIndex;
+
+  @Inject
+  private HibernateSessionManager _manager;
+
+  void onActivate(Person person)
+  {
+    _person = person;
+  }
+
+  Object onPassivate() { return _person; }
+
+  Object onSuccess()
+  {
+    _manager.commit();
+
+    return _personIndex;
+  }
+}
++----+
+
+  In this example, the Person object may be updated by a form; the form's success event handler method,
+  onSuccess(), asks the HibernateSessionManager to commit the current transaction before returning to
+  the PersonIndex page.
\ No newline at end of file

Modified: tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/example/app0/pages/CachedForm.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/example/app0/pages/CachedForm.java?rev=645113&r1=645112&r2=645113&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/example/app0/pages/CachedForm.java (original)
+++ tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/example/app0/pages/CachedForm.java Sat Apr  5 08:06:11 2008
@@ -14,40 +14,49 @@
 
 package org.example.app0.pages;
 
-import java.util.List;
-
 import org.apache.tapestry.annotations.Cached;
 import org.apache.tapestry.annotations.Property;
+import org.apache.tapestry.hibernate.HibernateSessionManager;
 import org.apache.tapestry.ioc.annotations.Inject;
 import org.example.app0.entities.User;
 import org.hibernate.Session;
 
+import java.util.List;
+
 @SuppressWarnings("unused")
 public class CachedForm
 {
     @Property
     private String _name;
-    
-	@Property
+
+    @Property
     private User _user;
-    
+
     @Property
     private int _index;
-    
+
     @Inject
     private Session _session;
-    
-    void onSuccess() {
+
+    @Inject
+    private HibernateSessionManager _manager;
+
+    void onSuccess()
+    {
         User user = new User();
         user.setFirstName(_name);
+
         _session.save(user);
+
+        _manager.commit();
     }
 
     @SuppressWarnings("unchecked")
-	@Cached
-    public List<User> getUsers() {
-    	return _session.createQuery("from User").list();
+    @Cached
+    public List<User> getUsers()
+    {
+        return _session.createQuery("from User").list();
     }
-    
-    
+
+
 }

Modified: tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/example/app0/pages/EncodeEntities.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/example/app0/pages/EncodeEntities.java?rev=645113&r1=645112&r2=645113&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/example/app0/pages/EncodeEntities.java (original)
+++ tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/example/app0/pages/EncodeEntities.java Sat Apr  5 08:06:11 2008
@@ -14,38 +14,48 @@
 
 package org.example.app0.pages;
 
-import java.util.List;
-
 import org.apache.tapestry.annotations.Property;
+import org.apache.tapestry.hibernate.HibernateSessionManager;
 import org.apache.tapestry.ioc.annotations.Inject;
 import org.example.app0.entities.User;
 import org.hibernate.Session;
 
-public class EncodeEntities {
-	@Inject
-	@Property
-	private Session _session;
-	
-	@SuppressWarnings("unused")
-	@Property
-	private User _user;
-	
-	void onCreate() {
-		User user = new User();
-		user.setFirstName("name");
-		_session.save(user);
-	}
-
-	@SuppressWarnings("unchecked")
-	User onPassivate() {
-		List<User> users = _session.createQuery("from User").list();
-		if (users.isEmpty())
-			return null;
-		
-		return users.get(0);
-	}
-	
-	void onActivate(User user) {
-		_user = user;
-	}
+import java.util.List;
+
+public class EncodeEntities
+{
+    @Inject
+    private Session _session;
+
+    @SuppressWarnings("unused")
+    @Property
+    private User _user;
+
+    @Inject
+    private HibernateSessionManager _manager;
+
+    void onCreate()
+    {
+        User user = new User();
+        user.setFirstName("name");
+
+        _session.save(user);
+
+        _manager.commit();
+    }
+
+    @SuppressWarnings("unchecked")
+    User onPassivate()
+    {
+        List<User> users = _session.createQuery("from User").list();
+        if (users.isEmpty())
+            return null;
+
+        return users.get(0);
+    }
+
+    void onActivate(User user)
+    {
+        _user = user;
+    }
 }

Modified: tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/example/app0/pages/PersistEntity.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/example/app0/pages/PersistEntity.java?rev=645113&r1=645112&r2=645113&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/example/app0/pages/PersistEntity.java (original)
+++ tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/example/app0/pages/PersistEntity.java Sat Apr  5 08:06:11 2008
@@ -14,45 +14,61 @@
 
 package org.example.app0.pages;
 
-import java.util.List;
-
 import org.apache.tapestry.annotations.Persist;
 import org.apache.tapestry.annotations.Property;
+import org.apache.tapestry.hibernate.HibernateSessionManager;
 import org.apache.tapestry.ioc.annotations.Inject;
 import org.example.app0.entities.User;
 import org.hibernate.Session;
 
-public class PersistEntity {
-	@Persist("entity")
-	@Property
-	private User _user;
-	
-	@Inject
-	private Session _session;
-		
-	void onCreateEntity() {
-		User user = new User();
-		user.setFirstName("name");
-		_session.save(user);
-		_user = user;
-	}
-	
-	void onChangeName() {
-		_user.setFirstName("name2");
-		// avoid having the changes saved if the request transaction is committed
-		_session.evict(_user);
-	}
-	
-	void onSetToTransient() {
-		_user = new User();
-	}
-	
-	void onSetToNull() {
-		_user = null;
-	}
-	
-	void onDelete() {
-		for(User user : (List<User>)_session.createQuery("from User").list())
-			_session.delete(user);
-	}
+import java.util.List;
+
+public class PersistEntity
+{
+    @Persist("entity")
+    @Property
+    private User _user;
+
+    @Inject
+    private Session _session;
+
+    @Inject
+    private HibernateSessionManager _manager;
+
+    void onCreateEntity()
+    {
+        User user = new User();
+        user.setFirstName("name");
+
+        _session.save(user);
+        _manager.commit();
+
+        _user = user;
+    }
+
+    void onChangeName()
+    {
+        _user.setFirstName("name2");
+        // avoid having the changes saved if the request transaction is committed
+        // This may no longer be necessary due to TAPESTRY-2247
+        _session.evict(_user);
+    }
+
+    void onSetToTransient()
+    {
+        _user = new User();
+    }
+
+    void onSetToNull()
+    {
+        _user = null;
+    }
+
+    void onDelete()
+    {
+        for (User user : (List<User>) _session.createQuery("from User").list())
+            _session.delete(user);
+
+        _manager.commit();
+    }
 }

Modified: tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/example/app0/services/AppModule.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/example/app0/services/AppModule.java?rev=645113&r1=645112&r2=645113&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/example/app0/services/AppModule.java (original)
+++ tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/example/app0/services/AppModule.java Sat Apr  5 08:06:11 2008
@@ -1,4 +1,4 @@
-// Copyright 2007 The Apache Software Foundation
+// Copyright 2007, 2008 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.
@@ -14,10 +14,17 @@
 
 package org.example.app0.services;
 
+import org.apache.tapestry.TapestryConstants;
 import org.apache.tapestry.hibernate.HibernateModule;
+import org.apache.tapestry.ioc.MappedConfiguration;
 import org.apache.tapestry.ioc.annotations.SubModule;
 
 @SubModule(HibernateModule.class)
-public class AppModule {
+public class AppModule
+{
+    public static void contributeApplicationDefaults(MappedConfiguration<String, String> configuration)
+    {
+        configuration.add(TapestryConstants.PRODUCTION_MODE_SYMBOL, "false");
+    }
 
 }