hi,

I got a strange problem that when using Spring managed transaction with
injected persistence context ( i.e. @PersistenceContext private
EntityManager em; ) when deployed to JBoss (not using the default unified
classloader). By debugging at the OpenJPA code and also from the stacktrace,
a newly created Query object is not opened. So for the first time I call
setParameter, exception is thrown from the assertOpen method of the
BrokerImpl.

<[email protected]><openjpa-1.0.1-r420667:592145 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:4302)
    at org.apache.openjpa.kernel.QueryImpl.assertOpen(QueryImpl.java:1623)
    at org.apache.openjpa.kernel.DelegatingQuery.assertOpen(
DelegatingQuery.java:629)
    at org.apache.openjpa.persistence.QueryImpl.setParameter(QueryImpl.java
:470)
    at org.apache.openjpa.persistence.QueryImpl.setParameter(QueryImpl.java
:56)


At the following Spring JPA log, the first two lines show my previous
transaction is successful and the EM was closed, and then (after I click
another page that) I trigger a query that create a new EM and then an
exception is thrown.
2008-01-06 15:12:50,454 DEBUG [
org.springframework.orm.jpa.JpaTransactionManager] Triggering
afterCompletion synchronization
2008-01-06 15:12:50,454 DEBUG [
org.springframework.orm.jpa.JpaTransactionManager] Closing JPA EntityManager
[EMAIL PROTECTED] after transaction
2008-01-06 15:12:51,860 DEBUG [
org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler]
Creating new EntityManager for shared EntityManager invocation


The case is complex as,

   1. my code has no exception if I use programmatic transaction instead
   of Spring managed transaction. It's just not as elegant as the Spring
   managed transaction code.
   2. It is normal for Spring to start a new Entity Manager according to
   the Spring doc and also a thread about multi-thread transaction *[1]
   3. The Spring managed transaction code does work outside JBoss. I have
   a unit test that use mock objects to simulate the whole
   WebApplicationContext and there is no exception. There is exception only
   when the application is run inside JBoss under a non-unified classloader.

I guess it is not a problem with OpenJPA, but an issue with Spring in JBoss.
However, as the exception in the OpenJPA code, I'd like to get some ideas
from this mail list in order to figure out how should I ask in the
Spring/JBoss forum. For example, in what scenario a new Entity Manager may
create Query that is not opened by default?  Any idea?

Thank you in advance.

Regards,
mingfai

[1] -
http://forum.springframework.org/showthread.php?t=46402&highlight=%40PersistenceContext

Reply via email to