I need to use query that fetches objects from multiple entity groups
(which means I can't use transactions). Here's the method:
@Override
public CollectionItem findInactiveItems(Date endDate) {
inactiveItems =
em.createNamedQuery(findInactiveItems).setParameter(endDate,
endDate).getResultList();
if(null == inactiveItems) inactiveItems = new ArrayListItem();
inactiveItems.size();
return inactiveItems;
}
However, calling getResultList() causes the following error:
Caused by: org.datanucleus.exceptions.NucleusUserException: Object
Manager has been closed
at
org.datanucleus.ObjectManagerImpl.assertIsOpen(ObjectManagerImpl.java:
3876)
at
org.datanucleus.ObjectManagerImpl.getTransaction(ObjectManagerImpl.java:
596)
at
org.datanucleus.jpa.EntityTransactionImpl.isActive(EntityTransactionImpl.java:
61)
at org.datanucleus.jpa.JPAQuery.getResultList(JPAQuery.java:158)
I found here on groups the same error posted with suggestions that
using OpenEntityManagerInViewFilter should keep entity manager
throughout the request. Unforfunately, I can't get this filter working
because it tries to create a new entity manager factory while gae
allows to create only one of those.
Here is part of my web.xml
servlet
servlet-namecontext/servlet-name
servlet-class
org.springframework.web.context.ContextLoaderServlet
/servlet-class
load-on-startup1/load-on-startup
/servlet
filter
filter-nameOpenEntityManagerInViewFilter/filter-name
filter-
classorg.springframework.orm.jpa.support.OpenEntityManagerInViewFilter/
filter-class
init-param
param-nameentityManagerFactory/param-name
param-valueentityManagerFactory/param-value
/init-param
/filter
filter-mapping
filter-nameOpenEntityManagerInViewFilter/filter-name
url-pattern*.html/url-pattern
/filter-mapping
And part of applicationContext.xml:
bean id=entityManagerFactory name=entityManagerFactory
class=org.springframework.orm.jpa.LocalEntityManagerFactoryBean
scope=singleton
property name=persistenceUnitName
value=transactions-optional /
/bean
bean id=transactionManager
class=org.springframework.orm.jpa.JpaTransactionManager
scope=singleton
property name=entityManagerFactory
ref=entityManagerFactory /
/bean
And here is the error caused by filter:
org.springframework.web.servlet.FrameworkServlet initServletBean:
Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error
creating bean with name 'entityManagerFactory' defined in
ServletContext resource [/WEB-INF/allewidok-servlet.xml]: Invocation
of init method failed; nested exception is
javax.persistence.PersistenceException: Provider error. Provider:
org.datanucleus.store.appengine.jpa.DatastorePersistenceProvider
(...)
Caused by: java.lang.IllegalStateException: Application code attempted
to create a EntityManagerFactory named transactions-optional, but one
with this name already exists! Instances of EntityManagerFactory are
extremely slow to create and it is usually not necessary to create one
with a given name more than once. Instead, create a singleton and
share it throughout your code. If you really do need to create a
duplicate EntityManagerFactory (such as for a unittest suite), set the
appengine.orm.disable.duplicate.emf.exception system property to avoid
this error.
at
org.datanucleus.store.appengine.jpa.DatastoreEntityManagerFactory.checkForRepeatedAllocation(DatastoreEntityManagerFactory.java:
136)
at
org.datanucleus.store.appengine.jpa.DatastoreEntityManagerFactory.init(DatastoreEntityManagerFactory.java:
64)
at
org.datanucleus.store.appengine.jpa.DatastorePersistenceProvider.createEntityManagerFactory(DatastorePersistenceProvider.java:
35)
at javax.persistence.Persistence.createFactory(Persistence.java:172)
So, has anybody actually used OpenEntityManagerInViewFilter on GAE?
--
You received this message because you are subscribed to the Google Groups
Google App Engine for Java group.
To post to this group, send email to google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at
http://groups.google.com/group/google-appengine-java?hl=en.