You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openjpa.apache.org by Don Brady <db...@pobox.com> on 2007/01/01 20:52:25 UTC

Should UserTransaction Work?

I cannot get UserTransaction to work.

Nothing happens when I commit.

This consists of:

- Using a JTA datasource
- specifying Bean Managed Transaction rather then CMT on the enclosing 
session Bean.
- looking up a UserTransaction with:
     UserTransaction userTran = (UserTransaction) initCtx
                .lookup("java:comp/UserTransaction");

 then doing a begin on it, some entity lookup and changes, and a commit.

Could anyone tell me if this should work?  

This is under WebSphere 6.1.

As background, I am able to get a JTA data source to work fine if I use 
Container Managed Transactions rather than BMT.  The problem with that 
approach for me is that I am calling the session Bean as a 
web-service-enable endpoint.  If I leave committing the transaction 
entirely to JTA, the commit  is done after all of my web service code 
has exited and any errors are thrown as soap faults.   I want to be able 
to catch the error and analyze it before returning from the web 
service.  I can also do this fine with Resource Local Transactions but 
then I do not get the benefits of a JTA datasource managed by WebSphere.

So I am trying to use JTA with BMT which I believe would allow me to 
catch errors on commit.

If this is too much of  a user question for this list, please let me 
know.....

Thanks!

Don








 

Re: Should UserTransaction Work?

Posted by Kevin Sutter <kw...@gmail.com>.
Don,
One clarification...

On 1/1/07, Don Brady <db...@pobox.com> wrote:
>
>
> This is under WebSphere 6.1.
>
> Are you attempting to use OpenJPA with standard WebSphere 6.1 (ala the
DeveloperWorks article that Roland and I wrote --
http://www-128.ibm.com/developerworks/websphere/techjournal/0612_barcia/0612_barcia.html),
or are you using the EJB3/JPA Feature Pack (
https://www14.software.ibm.com/iwm/web/cc/earlyprograms/websphere/was61ejb3/)?
The Feature Pack support is a much more integrated solution.  The answers to
your questions may depend on the environment.  Thanks!

Kevin

Re: Should UserTransaction Work?

Posted by Kevin Sutter <kw...@gmail.com>.
Don,
Glad to hear that you got this working.  Since it sounds like you are using
application-managed EntityManagers, then you should have two choices to get
your PersistenceContext associated with your BMT.  As you have found out,
you can start the BMT before creating the EM.  This is the easiest, but it
may not always be optimal.  The other alternative is to use the
EM.joinTransaction() method.  You may want to try this out as an alternative
solution.

Thanks,
Kevin

On 1/7/07, Don Brady <db...@pobox.com> wrote:
>
> Michael Dick wrote:
> >
> > If you lookup the UserTransaction in your Session Bean, then your
> > approach
> > should work. I tried making the Feature Pack sample application a BMT
> > bean
> > and it seemed to work for me.  I can send you the application if you'd
> > like.
> >
> > If the transaction is started prior to looking up a  BMT bean, then it
> > will
> > be suspended before the bean method
> > executes. I don't know much about web services, this might not be the
> > case
> > or possible.
>
> Michael and Craig and Kevin,
>
> I got it to work!  Thanks very much for the help.
>
> My error was in failing to start the Transaction *prior to* creating
> the EntityManager.   Once I did that, it worked.
>
> I should have realized that  OpenJPA needed to have the Global
> Transaction already started by the time it looks to see if it is running
> in a Transaction context.
>
> As Craig mentioned,  this BMT approach is a very nice pattern to have
> working, because it allows me to pass the underlying error back to the
> Web Service caller, rather than just the non-specfic
> TransactionRolledBackException from a CMT bean.
>
> Thanks,
>
> Don
>
>
>

Re: Should UserTransaction Work?

Posted by Don Brady <db...@pobox.com>.
Michael Dick wrote:
>
> If you lookup the UserTransaction in your Session Bean, then your 
> approach
> should work. I tried making the Feature Pack sample application a BMT 
> bean
> and it seemed to work for me.  I can send you the application if you'd 
> like.
>
> If the transaction is started prior to looking up a  BMT bean, then it 
> will
> be suspended before the bean method
> executes. I don't know much about web services, this might not be the 
> case
> or possible.

Michael and Craig and Kevin,

 I got it to work!  Thanks very much for the help.

 My error was in failing to start the Transaction *prior to* creating 
the EntityManager.   Once I did that, it worked.

 I should have realized that  OpenJPA needed to have the Global 
Transaction already started by the time it looks to see if it is running 
in a Transaction context.

 As Craig mentioned,  this BMT approach is a very nice pattern to have 
working, because it allows me to pass the underlying error back to the 
Web Service caller, rather than just the non-specfic 
TransactionRolledBackException from a CMT bean. 

 Thanks,

 Don



Re: Should UserTransaction Work?

Posted by Michael Dick <mi...@gmail.com>.
Hi Don,

On 1/1/07, Craig L Russell <Cr...@sun.com> wrote:
>
> Hi Don,
>
> The short answer is yes, UserTransaction is supposed to work.
>
> On Jan 1, 2007, at 11:52 AM, Don Brady wrote:
>
> > I cannot get UserTransaction to work.
> >
> > Nothing happens when I commit.
>
> Is the symptom that the commit succeeds but there is no change in the
> database?
>
> >
> > This consists of:
> >
> > - Using a JTA datasource
> > - specifying Bean Managed Transaction rather then CMT on the
> > enclosing session Bean.
> > - looking up a UserTransaction with:
> >     UserTransaction userTran = (UserTransaction) initCtx
> >                .lookup("java:comp/UserTransaction");
> >
> > then doing a begin on it, some entity lookup and changes, and a
> > commit.
>
> Is the EntityManagerFactory (PersistenceUnit) also declared as JTA,
> in addition to the DataSource that it uses? Both need to be JTA-enabled.
>
> >
> > Could anyone tell me if this should work?
> > This is under WebSphere 6.1.
> >
> > As background, I am able to get a JTA data source to work fine if I
> > use Container Managed Transactions rather than BMT.  The problem
> > with that approach for me is that I am calling the session Bean as
> > a web-service-enable endpoint.  If I leave committing the
> > transaction entirely to JTA, the commit  is done after all of my
> > web service code has exited and any errors are thrown as soap
> > faults.   I want to be able to catch the error and analyze it
> > before returning from the web service.  I can also do this fine
> > with Resource Local Transactions but then I do not get the benefits
> > of a JTA datasource managed by WebSphere.
>
> And the possibility of using other transactional resources as well.


If you lookup the UserTransaction in your Session Bean, then your approach
should work. I tried making the Feature Pack sample application a BMT bean
and it seemed to work for me.  I can send you the application if you'd like.


If the transaction is started prior to looking up a  BMT bean, then it will
be suspended before the bean method
executes. I don't know much about web services, this might not be the case
or possible.

> >
> > So I am trying to use JTA with BMT which I believe would allow me
> > to catch errors on commit.
>
> Right, this is a good pattern to use in order to wrap database errors
> with your own (presumably more user-friendly) exceptions.
>
> Craig
> >
> > If this is too much of  a user question for this list, please let
> > me know.....
> >
> > Thanks!
> >
> > Don
> >
> >
> >
> >
> >
> >
> >
> >
>
> Craig Russell
> Architect, Sun Java Enterprise System http://java.sun.com/products/jdo
> 408 276-5638 mailto:Craig.Russell@sun.com
> P.S. A good JDO? O, Gasp!
>
>
>
>
Hope this helps,
-- 
-Michael Dick

Re: Should UserTransaction Work?

Posted by Craig L Russell <Cr...@Sun.COM>.
Hi Don,

The short answer is yes, UserTransaction is supposed to work.

On Jan 1, 2007, at 11:52 AM, Don Brady wrote:

> I cannot get UserTransaction to work.
>
> Nothing happens when I commit.

Is the symptom that the commit succeeds but there is no change in the  
database?

>
> This consists of:
>
> - Using a JTA datasource
> - specifying Bean Managed Transaction rather then CMT on the  
> enclosing session Bean.
> - looking up a UserTransaction with:
>     UserTransaction userTran = (UserTransaction) initCtx
>                .lookup("java:comp/UserTransaction");
>
> then doing a begin on it, some entity lookup and changes, and a  
> commit.

Is the EntityManagerFactory (PersistenceUnit) also declared as JTA,  
in addition to the DataSource that it uses? Both need to be JTA-enabled.

>
> Could anyone tell me if this should work?
> This is under WebSphere 6.1.
>
> As background, I am able to get a JTA data source to work fine if I  
> use Container Managed Transactions rather than BMT.  The problem  
> with that approach for me is that I am calling the session Bean as  
> a web-service-enable endpoint.  If I leave committing the  
> transaction entirely to JTA, the commit  is done after all of my  
> web service code has exited and any errors are thrown as soap  
> faults.   I want to be able to catch the error and analyze it  
> before returning from the web service.  I can also do this fine  
> with Resource Local Transactions but then I do not get the benefits  
> of a JTA datasource managed by WebSphere.

And the possibility of using other transactional resources as well.
>
> So I am trying to use JTA with BMT which I believe would allow me  
> to catch errors on commit.

Right, this is a good pattern to use in order to wrap database errors  
with your own (presumably more user-friendly) exceptions.

Craig
>
> If this is too much of  a user question for this list, please let  
> me know.....
>
> Thanks!
>
> Don
>
>
>
>
>
>
>
>

Craig Russell
Architect, Sun Java Enterprise System http://java.sun.com/products/jdo
408 276-5638 mailto:Craig.Russell@sun.com
P.S. A good JDO? O, Gasp!