I actually started my code by editing the AuthorOps snippet from
ymnk's GAE version of it. He does reload the nature before editing it:
// Hold a val here so that the "id" closure holds it when we re-enter
this method
    bind("author", xhtml,
   "id" -> SHtml.hidden(() =>
                                findAuthor(author) match {
                                  case Some(a) => authorVar(a)
                                  case None =>}),
   "name" -> SHtml.text(author.name, author.name=_),
   "submit" -> SHtml.submit(?("Save"), doAdd))
findAuthor looks up the the author based on the id in the authorVar
RequestVar, and then sets that back into the authorVar. I wondered why
he did that, and then thought I understood...
Thanks!
On May 19, 5:01 pm, Derek Chen-Becker <dchenbec...@gmail.com> wrote:
> On the first part, I could add a withTx method to LocalEM that would handle
> wrapping the tx for you, if that's OK. Something like:
>
> def withTx[T] (f : => T)
>
> Then you could do
>
> MyEM.withTx {
>   prog
>
> }
>
> And it would handle the rollback. How does that sound?
>
> As for the second, if you're getting an exception on the merge I'd really
> like to see the Exception (and code, if possible). Off the top of my head
> the only time that should happen is if you have a constraint violation or
> something similar that would throw and exception even if you were operating
> on a non-detached entity. Take a look at the JPA Demo Library app. It does
> detached object merge all of the time for editing authors and books.
>
> Derek
>
> On Tue, May 19, 2009 at 2:42 PM, ngug <naftoli...@gmail.com> wrote:
>
> > On May 19, 4:31 pm, Derek Chen-Becker <dchenbec...@gmail.com> wrote:
> > > It should already. The closeEM method on both LocalEM and JndiEM checks
> > to
> > > see if the transaction has been marked rollback only and should handle
> > > committing/rollback there. If it doesn't then it's a bug.
> > But we're talking about userTx==true. I mean this:
> >  private def transaction(prog: =>Unit) {
> >    val tx = EntityManager.getTransaction
> >    try {
> >      tx.begin
> >      prog
> >      tx.commit
> >    } finally {
> >      if(tx.isActive)
> >        tx.rollback
> >    }
> >  }
> > ...
> >         def get = transaction {
> >          val l = NatureLocationType.lookup(loc.id)
> >          l.name = stringValues("name")
> >          l.allowStreet = booleanValues("allowStreet")
> >          l.allowHospital = booleanValues("allowHospital")
> >          l.allowDoctor = booleanValues("allowDoctor")
> >          l.allowEquipment = booleanValues("allowEquipment")
> >        }
> > (continued below)
>
> > > Also, for your first question:
>
> > > (I take that to mean that setting entity properties does not require a
>
> > > > transaction? I thought that in JPA entities are generally monitored
> > > > for modifications? Is that a mistake?)
>
> > > In the context of a form processing function, the JPA entity is in a
> > > "detached" state at the point that its members are being updated because
> > the
> > > session that it was loaded in (when the form rendered) is now closed. The
> > > transaction is only required when you perform the "merge" of the detached
> > > object into a new session to save the entity data. Whether or not the
> > entity
> > > is actually monitored is an implementation detail, since the spec only
> > says
> > > that when the entity is merged it should save data back to the database,
> > but
> > > it doesn't specify how that is done. Any exceptions related to JPA should
> > > only occur during the flush, or possibly the merge if the JPA provider
> > does
> > > an eager flush to the database. This is why I added the mergeAndFlush,
> > > persistAndFlush, and removeAndFlush methods, so that you would have a
> > > definite place to wrap in a try/catch. If you're doing multiple ops then
> > > you'll need to merge your entire block of merge,persist,remove and flush
> > > methods in a try/catch. Does that make sense? I know that sometimes the
> > > lifecycle of these things can take a few tries to wrap your head around,
> > so
> > > if this isn't clear let me know and I'll try to rephrase.
>
> > I understand you, and that's what I thought too, but I got an
> > exception when I tried to merge a detached entity! If I could get an
> > entity in one request, close the EM, and in the next request just
> > modify it and merge it it would be great, but so far I haven't managed
> > to. If you can't think of any explanation offhand I'll try to
> > reproduce it in an isolated snippet.
> > Thanks!
>
> > > Derek
>
> > > On Tue, May 19, 2009 at 2:07 PM, ngug <naftoli...@gmail.com> wrote:
>
> > > > P.S. I wrote a method to handle the boilerplate of opening/closing/
> > > > checking whether to rollback transactions. Shouldn't ScalaJPA have
> > > > such a method? Or does it?
> > > > Thanks.

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Lift" group.
To post to this group, send email to liftweb@googlegroups.com
To unsubscribe from this group, send email to 
liftweb+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/liftweb?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to