openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Patrick Linskey" <plins...@bea.com>
Subject RE: Set query params without TX?
Date Wed, 25 Apr 2007 05:35:11 GMT
Yep -- you've gotta keep it open. If you want to support any JPA impl,
you need to have an EM proxy (please please please make it a dynamic
proxy that implements all the interfaces that the proxied thing
implements).

If you're happy tying yourself to OpenJPA (or if you want to optimize
for OpenJPA), then you can use the openjpa.AutoDetach property to tell
OpenJPA how to handle non-transactional work. In that scenario, you can
keep a single EM per your delegating instance, and rely on OpenJPA to do
the transactional PC semantics.

-Patrick

-- 
Patrick Linskey
BEA Systems, Inc.
_______________________________________________________________________
Notice:  This email message, together with any attachments, may contain
information  of  BEA Systems,  Inc.,  its subsidiaries  and  affiliated
entities,  that may be confidential,  proprietary,  copyrighted  and/or
legally privileged, and is intended solely for the use of the individual
or entity named in this message. If you are not the intended recipient,
and have received this message in error, please immediately return this
by email and then delete it. 

> -----Original Message-----
> From: Dain Sundstrom [mailto:dain@iq80.com] 
> Sent: Tuesday, April 24, 2007 9:56 PM
> To: open-jpa-dev@incubator.apache.org
> Subject: Re: Set query params without TX?
> 
> Man, I'm dumb.
> 
> This code is the EntityManager wrapper for the Container 
> managed EMs (which I wrote so long ago don't remember it).  
> So how is this supposed to work in our container managed EM?  
> The method looks like
> this:
> 
>      public Query createNamedQuery(String name) {
>          EntityManager entityManager = getEntityManager();
>          try {
>              return entityManager.createNamedQuery(name);
>          } finally {
>              closeIfNoTx(entityManager);
>          }
>      }
> 
> So if there is no tx are we supposed to leave the 
> EntityManager open?  I'm confused because it seems like I'm 
> supposed to close the em, but if I do the I can't set 
> parameters on the query.
> 
> -dain
> 
> On Apr 24, 2007, at 7:31 PM, Patrick Linskey wrote:
> 
> >>>> 	at org.apache.openjpa.persistence.EntityManagerImpl.close
> >>>> (EntityManagerImpl.java:999)
> >>
> >> 3) OpenJPA calls em.close since there is no transaction, which I 
> >> think "closes" the query
> >>
> >>>> 	at org.apache.openejb.persistence.JtaEntityManager.closeIfNoTx
> >>>> (JtaEntityManager.java:87)
> >>
> >> 2) OpenJPA calls closeIfNoTx
> >>
> >>>> 	at
> >>>> org.apache.openejb.persistence.JtaEntityManager.createNamedQuery
> >>>> (JtaEntityManager.java:189)
> >>
> >> 1) OpenEJB calls createNamedQuery
> >>
> >>>> 	at org.apache.openejb.core.cmp.jpa.JpaCmpEngine.createNamedQuery
> >>>> (JpaCmpEngine.java:287)
> >
> > JtaEntityManager is one of your classes, not one of ours.  
> > closeIfNoTx is
> > your method, not ours. Punk.
> >
> > -Patrick
> >
> > --
> > Patrick Linskey
> > BEA Systems, Inc.
> > 
> ______________________________________________________________________
> > _
> > Notice:  This email message, together with any attachments, may 
> > contain
> > information  of  BEA Systems,  Inc.,  its subsidiaries  and   
> > affiliated
> > entities,  that may be confidential,  proprietary,  copyrighted   
> > and/or
> > legally privileged, and is intended solely for the use of the 
> > individual or entity named in this message. If you are not the 
> > intended recipient, and have received this message in error, please 
> > immediately return this by email and then delete it.
> >
> >> -----Original Message-----
> >> From: Dain Sundstrom [mailto:dain@iq80.com]
> >> Sent: Tuesday, April 24, 2007 7:29 PM
> >> To: open-jpa-dev@incubator.apache.org
> >> Subject: Re: Set query params without TX?
> >>
> >> I am "they", the one writing the cmp code in OpenEJB.
> >>
> >> On first read of the stack trace I thought as you that, I 
> was the one 
> >> close the entity manager, but on a second read I notice it was 
> >> OpenJPA calling "closeIfNoTx" that closes the broker.
> >>
> >>> On Apr 24, 2007, at 7:02 PM, Dain Sundstrom wrote:
> >>>
> >>>> java.lang.IllegalStateException
> >>>> 	at
> >> org.apache.openjpa.kernel.BrokerImpl.free(BrokerImpl.java:4083)
> >>>> 	at
> >> org.apache.openjpa.kernel.BrokerImpl.close(BrokerImpl.java:4013)
> >>>> 	at org.apache.openjpa.kernel.DelegatingBroker.close
> >>>> (DelegatingBroker.java:1284)
> >>>> 	at org.apache.openjpa.persistence.EntityManagerImpl.close
> >>>> (EntityManagerImpl.java:999)
> >>
> >> 3) OpenJPA calls em.close since there is no transaction, which I 
> >> think "closes" the query
> >>
> >>>> 	at org.apache.openejb.persistence.JtaEntityManager.closeIfNoTx
> >>>> (JtaEntityManager.java:87)
> >>
> >> 2) OpenJPA calls closeIfNoTx
> >>
> >>>> 	at
> >>>> org.apache.openejb.persistence.JtaEntityManager.createNamedQuery
> >>>> (JtaEntityManager.java:189)
> >>
> >> 1) OpenEJB calls createNamedQuery
> >>
> >>>> 	at org.apache.openejb.core.cmp.jpa.JpaCmpEngine.createNamedQuery
> >>>> (JpaCmpEngine.java:287)
> >>>> 	at org.apache.openejb.core.cmp.jpa.JpaCmpEngine.queryBeans
> >>>> (JpaCmpEngine.java:218)
> >>>> 	at org.apache.openejb.core.cmp.CmpContainer.findEJBObject
> >>>> (CmpContainer.java:718)
> >>>> 	at org.apache.openejb.core.cmp.CmpContainer.invoke
> >>>> (CmpContainer.java:286)
> >>>>
> >>>> -dain
> >>>>
> >>>> On Apr 24, 2007, at 3:07 PM, Marc Prud'hommeaux wrote:
> >>>>
> >>>>> Dain-
> >>>>>
> >>>>> Can you send the embedded exception as well? That should
> >> tell us who
> >>>>> closed the query, and it might give us a hint why...
> >>>>>
> >>>>>
> >>>>> On Apr 24, 2007, at 3:03 PM, Dain Sundstrom wrote:
> >>>>>
> >>>>>> I have some code that runs outside of a transaction which does

> >>>>>> basically the following:
> >>>>>>
> >>>>>>     Query query = entityManager.createNamedQuery(name)
> >>>>>>     query.setParameter(1, "foo");
> >>>>>>     List results = query.getResultList();
> >>>>>>
> >>>>>> If I don't set the parameter the code works fine (assuming the

> >>>>>> query didn't need a parameter), but when I set the
> >> parameter, I get
> >>>>>> the following exception:
> >>>>>>
> >>>>>> Caused by: <0.9.7-incubating-SNAPSHOT fatal user error>
> >>>>>> org.apache.openjpa.persistence.InvalidStateException:
> >> The context
> >>>>>> has been closed.  The stack trace at which the context
> >> was closed
> >>>>>> is held in the embedded exception.
> >>>>>> FailedObject: java.lang.IllegalStateException
> >>>>>> 	at org.apache.openjpa.kernel.BrokerImpl.assertOpen
> >>>>>> (BrokerImpl.java:4283)
> >>>>>> 	at org.apache.openjpa.kernel.QueryImpl.assertOpen
> >>>>>> (QueryImpl.java:1613)
> >>>>>> 	at org.apache.openjpa.kernel.DelegatingQuery.assertOpen
> >>>>>> (DelegatingQuery.java:626)
> >>>>>> 	at org.apache.openjpa.persistence.QueryImpl.setParameter
> >>>>>> (QueryImpl.java:404)
> >>>>>> 	at org.apache.openjpa.persistence.QueryImpl.setParameter
> >>>>>> (QueryImpl.java:49)
> >>>>>> 	at 
> org.apache.openejb.core.cmp.jpa.JpaCmpEngine.executeQuery
> >>>>>> (JpaCmpEngine.java:261)
> >>>>>>
> >>>>>> Is this supposed to work?  If not, maybe we should throw the

> >>>>>> exception when getting the query.
> >>>>>>
> >>>>>> In the mean time I'll code around this.
> >>>>>>
> >>>>>> -dain
> >>>>>
> >>>>
> >>>
> >>
> >>
> >
> > Notice:  This email message, together with any attachments, may  
> > contain information  of  BEA Systems,  Inc.,  its subsidiaries   
> > and  affiliated entities,  that may be confidential,  
> proprietary,   
> > copyrighted  and/or legally privileged, and is intended 
> solely for the 
> > use of the individual or entity named in this message. If 
> you are not 
> > the intended recipient, and have received this message in error, 
> > please immediately return this by email and then delete it.
> 
> 

Notice:  This email message, together with any attachments, may contain information  of  BEA
Systems,  Inc.,  its subsidiaries  and  affiliated entities,  that may be confidential,  proprietary,
 copyrighted  and/or legally privileged, and is intended solely for the use of the individual
or entity named in this message. If you are not the intended recipient, and have received
this message in error, please immediately return this by email and then delete it.

Mime
View raw message