为什么下面的代码导致org.datanucleus.exceptions.NucleusUserException:对象管理器已关闭?似乎在query.getResultList()处抛出异常.
public final void removeUserTokens(final String username) {
final Query query = entityManager.createQuery(
"SELECT p FROM PersistentLogin p WHERE username = :username");
query.setParameter("username", username);
for (Object token : query.getResultList()) {
entityManager.remove(token);
}
}
Run Code Online (Sandbox Code Playgroud)
例外:
org.datanucleus.exceptions.NucleusUserException: Object Manager has been closed
at org.datanucleus.ObjectManagerImpl.assertIsOpen(ObjectManagerImpl.java:3876)
at org.datanucleus.ObjectManagerImpl.getFetchPlan(ObjectManagerImpl.java:376)
at org.datanucleus.store.query.Query.getFetchPlan(Query.java:497)
at org.datanucleus.store.appengine.query.DatastoreQuery$6.apply(DatastoreQuery.java:611)
at org.datanucleus.store.appengine.query.DatastoreQuery$6.apply(DatastoreQuery.java:610)
at org.datanucleus.store.appengine.query.LazyResult.resolveNext(LazyResult.java:94)
at org.datanucleus.store.appengine.query.LazyResult$LazyAbstractListIterator.computeNext(LazyResult.java:215)
at org.datanucleus.store.appengine.query.AbstractIterator.tryToComputeNext(AbstractIterator.java:132)
at org.datanucleus.store.appengine.query.AbstractIterator.hasNext(AbstractIterator.java:127)
at org.datanucleus.store.appengine.query.LazyResult$AbstractListIterator.hasNext(LazyResult.java:169)
at com.mystuff.service.auth.PersistentTokenRepositoryImpl.removeUserTokens(PersistentTokenRepositoryImpl.java:90)
Run Code Online (Sandbox Code Playgroud)
编辑:我增加了datanucleus的日志级别,这就是我所看到的.
FINE: Object Manager "org.datanucleus.ObjectManagerImpl@5d8d3d6c" opened for datastore "org.datanucleus.store.appengine.DatastoreManager@2447e380"
Feb 25, 2010 7:21:38 AM org.datanucleus.ObjectManagerImpl initialiseLevel1Cache
FINE: …Run Code Online (Sandbox Code Playgroud) 我正在使用JPA和Google App Engine.假设我有一个非常简单的@Entity,它由一个Key和一个String组成,仅此而已.我现在创建10000个这些实体,将它们放在一个列表中,现在想要存储所有这些实体.
如果我尝试使用EntityManager em和for循环来浏览所有实体的List ...
for(MyEntity entity : listOfAllEntities) {
em.persist(entity);
}
Run Code Online (Sandbox Code Playgroud)
..我将得到一个IllegalArgumentException:
java.lang.IllegalArgumentException:无法在单个事务中对多个实体组进行操作.
据我所知,我需要为每个persist()调用关闭并重新打开EntityManager.当然,这非常耗时.我正在尝试每天运行一次重新加载所有实体的任务.根据GAE政策,任务的超时时间为30秒.
所以另一种方法是一次只保存500个实体并多次运行任务,我认为这比实际情况要复杂得多.
这是实现我想要做的事情的唯一方法,还是我在这里遗漏了什么?
解决方案: 所有答案都指向同一方向.我只是通过创建一个"虚拟父"实体来创建一对多关系.在我的情况下,我真的不需要父母,而且在现实世界中它没有多大意义.但是在将这个虚拟实体设置为每个子实体的父实体后,我可以像以前那样完全保存它们,而不必过多关注事务.谢谢大家.