I know I am repeating myself, but what is getting in the way of NOT starting
a transaction at all in the case of a validation error... Shoudn't the
transaction be started much later anyways, and only if validation passed?


On Thu, May 1, 2008 at 4:51 PM, Adam Hardy <[EMAIL PROTECTED]>
wrote:

> Yes, you're right. There are also several other things lacking that I
> would find useful. But I guess it's still version 1.
>
>
>
> Alexander Snaps on 01/05/08 15:35, wrote:
>
> > Am I wrong, or JPA's EntityManager has no support for anything like
> > evict()? I think this is an Hibernate's Session specific feature...
> > Alex
> >
> > On Thu, May 1, 2008 at 3:54 PM, Eric D Nielsen <[EMAIL PROTECTED]> wrote:
> >
> >  [ I suspect this is going to break threading....  Is there a good way
> > > to
> > > respond
> > > to a message from a digest without breaking threading? )
> > >
> > > Adam Hardy on 26/04/08 10:42, wrote:
> > >
> > > > I am pulling in what I wrote earlier because I should correct what I
> > > >
> > > said
> > >
> > > > about letting entities slip out of scope. Following this situation:
> > > >
> > > > - Model-driven builds the model
> > > > - conversion to type and setting incoming HTTP param into Model
> > > > - validation occurs and fails
> > > >
> > > > the problem was spurious JPA updates - which can be avoided by
> > > > putting
> > > >
> > > an
> > >
> > > > interceptor in between the Validation and the Workflow interceptors:
> > > > all
> > > >
> > > it
> > >
> > > > should do is call EntityManager.clear().
> > > >
> > > > if (validationAwareAction.hasErrors()) getEntityManager().clear();
> > > >
> > > >
> > > > Using the JPA extended persistence context (not EJB), the clear()
> > > > will
> > > > eliminate any changes to the model before JPA comes to flush to the
> > > > db.
> > > >
> > > I
> > >
> > > > assume it would work in an EJB container too.
> > > >
> > > > Does that fit your situation, Eric?
> > > >
> > > Unfortunately no.  First clear is overkill, it evicts everything from
> > > the
> > > session, and only the model may need to be evicts (Users could have
> > > other
> > > items
> > > already merged back into the session at this point -- normally I would
> > > have
> > > merged my User entity from the HTTP Session to the Persistence session
> > > by
> > > this
> > > point in the interceptor stack to allow authentication/authorization
> > > checks).
> > >
> > > Secondly replacing the clear() with evict(((ModelDriven)
> > > action).getModel()) for
> > > instance would avoid that problem, but now you would lost the ability
> > > to
> > > lazy
> > > load anything from the model if needed for form redisplay.
> > >
> > > I'm 90% of the way to an initial solution right now, using two extra
> > > interceptors:
> > > ModelDrivenProtection
> > > ModelDrivenEnable
> > > (I need better names....)
> > >
> > > The first one is placed in the stack after prepare.  The second one is
> > > placed
> > > after validation.
> > >
> > > In my Hibernate based implementation of them:
> > > Protection calls
> > > session.setReadOnly(modelDrivenAction.getModel(),true) if
> > > the
> > > action also implements ValidationAware
> > >
> > > Enable calls session.setReadOnly(modelDrivenAction.getModel(),false)
> > > if
> > >  hasErrors() returns false
> > >
> > > I'm hoping I can come up with a more JPA provider agnostic version,
> > > after
> > > I get
> > > this pair working.  However as the JPA spec doesn't include a notion
> > > of
> > > readOnly, I think its going to have to be a custom version of the
> > > JPAValidationInterceptor extends ValidationInterceptor--
> > >
> > > Steps are something like
> > > doIntercept(...) {
> > > if (actionInvocation.getAction() instanceof ValidationAware &&
> > >    actionInvocation.getAction() instanceof ModelDriven) {
> > >  ValidationAware validationAwareAction = (ValidationAware)
> > > actionInvocation.getAction();
> > >  ModelDriven modelDrivenAction = (ModelDriven)
> > > actionInvocation.getAction();
> > >  em.setFlushMode(FlushMode.COMMIT)
> > >  String retVal = super.doIntercept(...);
> > >  if (validationAwareAction.hasErrors()) {
> > >   em.evict(modelDrivenAction.getModel());
> > >   // check for preparable and recall prepare to get a clean object
> > > back
> > > on the
> > > stack -- need to make sure hasErrors() still returns true though....
> > >   // push the request parameters onto the stack ahead of the model for
> > > redisplay of submitted values, while letting the model fill in others)
> > >  }
> > >  em.setFlushMode(FlushMode.AUTO);
> > >  return retVal;
> > > }
> > >
> > > I like the hibernate version better since the "persistence read only"
> > > is
> > > exactly
> > > the correct semantics for a failed-validation model object.  The
> > > generic
> > > JPA is
> > > nicer in that its not vendor specific, but much more kludgy.  In
> > > rather
> > > generalize it a bit more -- more the em.setFlushMode, em.evict calls
> > > to
> > > some
> > > interface and now we're to a more correct model driven situation:
> > > a) the backing model object will never contain invalid values outside
> > > of
> > > the
> > > scope of params, validation, thisNewInterceptor (possibly built into
> > > workflow
> > > or validation)
> > > b) values are still available for redisplay.
> > > c) the three callback functions (setReadOnly, setWriteable,
> > > replaceModel)
> > > or
> > > similar can be hooked up to different backing stores... allowing any
> > > lazy
> > > load
> > > or other similar special behavior provided by the data store to work
> > > transparently.
> > >
> > > This completely generalized version is the version that I would want
> > > to
> > > suggest
> > > for inclusion in Struts 2, but I'll need to work through the first two
> > > approaches first to gain some confidence.
> > >
> > > Eric
> > >
> > > ---------------------------------------------------------------------
> > > 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]
>
>


-- 
Alexander Snaps <[EMAIL PROTECTED]>
http://www.jroller.com/page/greenhorn
http://www.linkedin.com/in/alexandersnaps

Reply via email to