Struts 2 Prepare Interceptor, CRUD Pattern and Optimistic Locking

2008-09-22 Thread Frank D.

Also posted to Struts 2 forum on Nabble - apologies if this causes a
duplicate posting.

Planning to use Struts 2 and JPA  (OpenJPA) in a new application development
and am spending some time to review options of how it should be done.
There will be a large CRUD component within the application so I am working
on the patterns to use in those scenarios.

Following the CRUD examples in the Struts 2 In Action (and other sources), I
have been experimenting with the ParamsPrepareParams stack.  Using the
pattern shown in the Struts 2 in Action book, the following is my
understanding of the relevant points in the execution path.

- when an edit (save) action is called the prepare() method retrieves the
model object from the database (because there is an ID in the HTTP Request
parameters).  
- the Params interceptor is invoked then loads the values from the HTTP
Request parameters.  None of the documentation describes why this is done, I
assume the reason is to ensure that the Model object is fully populated 
(not all of the attributes may be on the UI and thus in the HTTP Request
parameters).  
- the action is then invoked - and persists the updated Model object 
(delegated to a service)

From what I can see, this causes a  conflicts with the use of a version
attribute for Optimistic Locking on the database.  

When the updates from the HTTP Request parameters are merged in with a newly
retrieved model object the version number/timestamp is the value retrieved
from the database.  Even if that row had been updated by another user/thread
since being retrieved the first time, the version checking would not catch
the conflicting updates becuase it has been refreshed to the latest value in
the DB.

It seems a fairly fundamental and obvious problem so I am worried that I am
mis-understanding the pattern described in the book (and repeated in other
samples).  

I know that the examples in the book are simplified, but I would expect
something like this to be commented on in the text.

Am I missing something ???  Can anybody confirm or contradict my reasoning?

-- 
View this message in context: 
http://www.nabble.com/Struts-2-Prepare-Interceptor%2C-CRUD-Pattern-and-Optimistic-Locking-tp19612252p19612252.html
Sent from the Struts - User mailing list archive at Nabble.com.


-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Re: Struts 2 Prepare Interceptor, CRUD Pattern and Optimistic Locking

2008-09-22 Thread Gabriel Belingueres
I agree that using the paramsPrepareParams is not the ideal stack to
handle optimistic locking.

However, assuming that you are not losing the original version number
(for example if you are submitting it as a hidden field of your edit
form), and you can reassign it to the appropriate POJO field through
the parameters interceptor, at the end, if there is a conflict in
version numbers between the original and the just loaded object, still
you have all the necessary information to detect the conflict.

2008/9/22 Frank D. [EMAIL PROTECTED]:

 Also posted to Struts 2 forum on Nabble - apologies if this causes a
 duplicate posting.

 Planning to use Struts 2 and JPA  (OpenJPA) in a new application development
 and am spending some time to review options of how it should be done.
 There will be a large CRUD component within the application so I am working
 on the patterns to use in those scenarios.

 Following the CRUD examples in the Struts 2 In Action (and other sources), I
 have been experimenting with the ParamsPrepareParams stack.  Using the
 pattern shown in the Struts 2 in Action book, the following is my
 understanding of the relevant points in the execution path.

 - when an edit (save) action is called the prepare() method retrieves the
 model object from the database (because there is an ID in the HTTP Request
 parameters).
 - the Params interceptor is invoked then loads the values from the HTTP
 Request parameters.  None of the documentation describes why this is done, I
 assume the reason is to ensure that the Model object is fully populated
 (not all of the attributes may be on the UI and thus in the HTTP Request
 parameters).
 - the action is then invoked - and persists the updated Model object
 (delegated to a service)

 From what I can see, this causes a  conflicts with the use of a version
 attribute for Optimistic Locking on the database.

 When the updates from the HTTP Request parameters are merged in with a newly
 retrieved model object the version number/timestamp is the value retrieved
 from the database.  Even if that row had been updated by another user/thread
 since being retrieved the first time, the version checking would not catch
 the conflicting updates becuase it has been refreshed to the latest value in
 the DB.

 It seems a fairly fundamental and obvious problem so I am worried that I am
 mis-understanding the pattern described in the book (and repeated in other
 samples).

 I know that the examples in the book are simplified, but I would expect
 something like this to be commented on in the text.

 Am I missing something ???  Can anybody confirm or contradict my reasoning?

 --
 View this message in context: 
 http://www.nabble.com/Struts-2-Prepare-Interceptor%2C-CRUD-Pattern-and-Optimistic-Locking-tp19612252p19612252.html
 Sent from the Struts - User mailing list archive at Nabble.com.


 -
 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]



Re: Struts 2 Prepare Interceptor, CRUD Pattern and Optimistic Locking

2008-09-22 Thread Frank D.

Thanks for the response.

I agree that there are a number of ways around the problem - I was just
worried that I mis-understanding the sample.




Gabriel Belingueres-2 wrote:
 
 I agree that using the paramsPrepareParams is not the ideal stack to
 handle optimistic locking.
 
 However, assuming that you are not losing the original version number
 (for example if you are submitting it as a hidden field of your edit
 form), and you can reassign it to the appropriate POJO field through
 the parameters interceptor, at the end, if there is a conflict in
 version numbers between the original and the just loaded object, still
 you have all the necessary information to detect the conflict.
 
 2008/9/22 Frank D. [EMAIL PROTECTED]:

 Also posted to Struts 2 forum on Nabble - apologies if this causes a
 duplicate posting.

 Planning to use Struts 2 and JPA  (OpenJPA) in a new application
 development
 and am spending some time to review options of how it should be done.
 There will be a large CRUD component within the application so I am
 working
 on the patterns to use in those scenarios.

 Following the CRUD examples in the Struts 2 In Action (and other
 sources), I
 have been experimenting with the ParamsPrepareParams stack.  Using the
 pattern shown in the Struts 2 in Action book, the following is my
 understanding of the relevant points in the execution path.

 - when an edit (save) action is called the prepare() method retrieves
 the
 model object from the database (because there is an ID in the HTTP
 Request
 parameters).
 - the Params interceptor is invoked then loads the values from the HTTP
 Request parameters.  None of the documentation describes why this is
 done, I
 assume the reason is to ensure that the Model object is fully populated
 (not all of the attributes may be on the UI and thus in the HTTP Request
 parameters).
 - the action is then invoked - and persists the updated Model object
 (delegated to a service)

 From what I can see, this causes a  conflicts with the use of a version
 attribute for Optimistic Locking on the database.

 When the updates from the HTTP Request parameters are merged in with a
 newly
 retrieved model object the version number/timestamp is the value
 retrieved
 from the database.  Even if that row had been updated by another
 user/thread
 since being retrieved the first time, the version checking would not
 catch
 the conflicting updates becuase it has been refreshed to the latest value
 in
 the DB.

 It seems a fairly fundamental and obvious problem so I am worried that I
 am
 mis-understanding the pattern described in the book (and repeated in
 other
 samples).

 I know that the examples in the book are simplified, but I would expect
 something like this to be commented on in the text.

 Am I missing something ???  Can anybody confirm or contradict my
 reasoning?

 --
 View this message in context:
 http://www.nabble.com/Struts-2-Prepare-Interceptor%2C-CRUD-Pattern-and-Optimistic-Locking-tp19612252p19612252.html
 Sent from the Struts - User mailing list archive at Nabble.com.


 -
 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]
 
 
 

-- 
View this message in context: 
http://www.nabble.com/Struts-2-Prepare-Interceptor%2C-CRUD-Pattern-and-Optimistic-Locking-tp19612252p19616065.html
Sent from the Struts - User mailing list archive at Nabble.com.


-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]