Ang.: [appengine-java] DataStore query without transaction - Spring 2.5 + JPA

2011-08-29 Thread Apturity
I just got the OpenEntityManagerInViewFilter to work (in Eclipse, have not 
deployed yet ) after having struggled for several days. 

Do you use the EMF class from 
http://code.google.com/intl/sv-SE/appengine/docs/java/datastore/jpa/overview.html
 
? If so, that might cause your problem since it creates an 
EntityManagerFactory. 

I have modified EMF to:

public final class EMF {

private static EMF _instance;

private static EntityManagerFactoryInfo emfInstance;

private EMF() {

Object o = SpringApplicationContext.getBean(entityManagerFactory);
emfInstance = (EntityManagerFactoryInfo)o;
}

public static EntityManagerFactory get() {
if (_instance == null) {
_instance = new EMF();
}
return emfInstance.getNativeEntityManagerFactory();
}

}


where SpringApplicationContext is implemented as specified here: 
http://sujitpal.blogspot.com/2007/03/accessing-spring-beans-from-legacy-code.html
 
.

You still need the .size() hack after using getResultList().

-- 
You received this message because you are subscribed to the Google Groups 
Google App Engine for Java group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/google-appengine-java/-/mrOKBfoM2n4J.
To post to this group, send email to google-appengine-java@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.



[appengine-java] DataStore query without transaction - Spring 2.5 + JPA

2010-04-08 Thread Nexus
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.