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
