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:[EMAIL PROTECTED]
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.