I've not used Open*InView support in AppEngine (don't like the pattern
myself ;).  However, if all that is to get around the problem of the
transaction limitations like you state just below, then there are a
couple of options:
- Declare the DAO methods as transaction-new; that way they won't
clash
- Declare the DAO methods as transaction-not-supported and use JDO (so
you don't have to have the .size() hack)

Sorry I can't help with the Open*InView thing, but hopefully one of
the above helps.

On Apr 8, 3:25 pm, Nexus <[email protected]> wrote:
> 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 Collection<Item> findInactiveItems(Date endDate) {
>                 inactiveItems =
> em.createNamedQuery("findInactiveItems").setParameter("endDate",
> endDate).getResultList();
>                 if(null == inactiveItems) inactiveItems = new 
> ArrayList<Item>();
>                 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-name>context</servlet-name>
>                 <servlet-class>
>                         org.springframework.web.context.ContextLoaderServlet
>                 </servlet-class>
>                 <load-on-startup>1</load-on-startup>
>         </servlet>
>
>         <filter>
>                 <filter-name>OpenEntityManagerInViewFilter</filter-name>
>         <filter-
> class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</
> filter-class>
>         <init-param>
>                 <param-name>entityManagerFactory</param-name>
>                 <param-value>entityManagerFactory</param-value>
>         </init-param>
>         </filter>
>
>         <filter-mapping>
>                 <filter-name>OpenEntityManagerInViewFilter</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 [email protected].
> To unsubscribe from this group, send email to 
> [email protected].
> For more options, visit this group 
> athttp://groups.google.com/group/google-appengine-java?hl=en.

-- 
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 [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.

Reply via email to