So how does transaction demarcation work in this common tapestry sequence:
1) in pageBeginRender(), call a service method to load the persisted
object and set it as a simple page property
2) tapestry form fields components then update the properties of the
persisted object and call some validators
3) in the form submit listener method, do some additional cross-field
validation
4) still within form submit, if validation does not succeed, rollback,
set a message on the delegate and return null to stay on the same page
OR 5) if validation succeeds, commit the transaction and return a link
to the next page to force a redirect-after-post
In this sequence I don't have a single service method which demarcates
the transaction.
I considered using a copy of the persisted object for manipulation
within the page and them passing that into a service method for
persisting the changes, but that adds a lot more code and even then I
end up with 2 transactions, one for the object load (database select)
and another for persisting the changes (database update).
What am I missing?
-- Mark R
James Carman wrote:
In case you didn't notice, I use the Spring classes too. I just don't use
the Spring DI container. I use HiveMind. I do the same sort of transaction
demarcation (in fact, I use Spring's syntax, hehe). I just do it within my
hivemodule.xml file.
-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Sam
Gendler
Sent: Wednesday, April 12, 2006 11:26 AM
To: Tapestry users
Subject: Re: tapestry-hibernate integration problem
I use the standard OpenSessionInView filter, which keep s a session
open throughout the processing of a single request. As for
transaction semantics, those are kept entirely in the service layer.
The UI layer is completely oblivious to transaction semantiks
precisely to avoid the problem you are having. My UI layer can call
service layer methods in full confidence that transaction semantics
will be correct.
I use spring to define transactions around my service layer methods.
It uses AOP to ensure that a transaction already exists or is
created,m as appropriate, and that the transaction gets committed
wherever appropriate. Those rules are defined within the Spring
applicationContext.xml config file, so it is easy to change and keep
track of how each method is executing.
My DAO layer is oblivious to what kind of transaction is currently
open, so that I don't have to redefine the same functionality for use
within different typs of transaction.
The beauty of this system is that there is no code dealing with
transactions anywhere within my codebase. It all happens inside
spring, and the only reference to it is in a config file, rather than
having to make sure that transactions are started and committed in
attach/detahc methods al over my codebase, etc.
--sam
On 4/12/06, James Carman <[EMAIL PROTECTED]> wrote:
I wouldn't inject sessions into your pages directly. Dealing with the
persistence store should be abstracted away from the view layer using a
DAO/Repository layer.
If you want an example of how to do that, you can download my example
application (via SVN of course) from:
http://www.carmanconsulting.com/svn/public/tapernate-example/trunk
This example does include the Open-Session-In-View pattern along with a
custom property persistence strategy for persistent entities and a few
other
goodies. The source code for the other libraries can be obtained from:
http://www.carmanconsulting.com/svn/public/tapernate/trunk
http://svn.javaforge.com/svn/hivemind/spring-hibernate3/trunk
http://svn.javaforge.com/svn/hivemind/hivemind-utils/trunk
http://svn.javaforge.com/svn/hivemind/spring-transaction/trunk
Note: To checkout from javaforge, you have to use anonymous/anon as the
username/password.
-----Original Message-----
From: bÄ—gantis debesis [mailto:[EMAIL PROTECTED]
Sent: Wednesday, April 12, 2006 8:21 AM
To: tapestry-user@jakarta.apache.org
Subject: tapestry-hibernate integration problem
Hi everyone,
I extended a BasePage and added there a getSession method, which opens a
hibernate session and starts a transaction (if it is not yet opened).
Also,
I commit the transaction and close the session on the overrided
BasePage.detach() method.
The problem is that when I save something on page 1 and then redirect to
page 2, page 2 gets the old information from the database. That is because
detach method on page1 (where the transaction commit resides) is invoked
after page2 getInformation() method called.
So, the question is, is there a method like detach but which is invoked
before another page starts its activities? Or maybe using transaction per
request is bad at all?
Or maybe you know some other easy way to intergrate tapestry and
hibernate?
Thank you in advance,
Valdemaras
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]