Hey guys.

I have hacked together an early draft of the JTA transaction stuff.

I have wrapped it up in a monad. Here  are some examples of usage:

 for {
   ctx <- TransactionContext.Required
   entity <- updatedEntities
   if !ctx.isRollbackOnly
 } {
   // transactional stuff
   ctx.getEntityManager.merge(entity)
 }

val users = for {
   ctx <- TransactionContext.Required
   name <- userNames
 } yield {
   // transactional stuff
   val query = ctx.getEntityManager.createNamedQuery("findUserByName")
   query.setParameter("userName", name)
   query.getSingleResult
 }

If you don't like the monadic approach you can just use the high-order
functions:

TransactionContext.withTxRequired {
    ... // REQUIRED semantics

  TransactionContext.withTxRequiresNew {
    ... // REQUIRES_NEW semantics
  }
}

I have implemented the same semantics as used in the EJB spec.
Required, RequiresNew, Mandatory, Supports, Never. All these are
monadic objects in the TransactionContext object.
I don't have a webapp to try this out, so I would be happy to get all
kinds of feedback, but API wise and bug reports or fixes.

This API is hooked into Derek's Scala-JPA stuff. I had my own impl of
this but replaced it with Derek's work.

Derek,
please go through the integration to see if I have done it correctly,
and where things code be improved.

All committers,
feel free to hack and change this code anyway you want.

The code is in a branch (wip-jta-jonas), you can find it here:
http://github.com/dpp/liftweb/tree/3783b9e2200cc57dd72baa1bd8cabdb1365ee923/lift-jta

Check the ScalaDoc (or the source) for the documentation on usage,
semantics etc.
Also see the README for configuration in persistence.xml etc.

Currently it is hard-coded to use the Atomikos Transaction library and
Hibernate JPA, that would have to be configurable + some other options
as well. See the TODOs in the code.

As I said, this needs feedback and testing. Thanks.

-- 
Jonas Bonér

twitter: @jboner
blog:    http://jonasboner.com
work:   http://crisp.se
work:   http://scalablesolutions.se
code:   http://github.com/jboner

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