相关疑难解决方法(0)

Google App Engine - org.datanucleus.exceptions.NucleusUserException:对象管理器已关闭

为什么下面的代码导致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)

java google-app-engine spring jpa datanucleus

6
推荐指数
1
解决办法
5242
查看次数

使用JPA在GAE中保存许多实体

我正在使用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个实体并多次运行任务,我认为这比实际情况要复杂得多.

这是实现我想要做的事情的唯一方法,还是我在这里遗漏了什么?

解决方案: 所有答案都指向同一方向.我只是通过创建一个"虚拟父"实体来创建一对多关系.在我的情况下,我真的不需要父母,而且在现实世界中它没有多大意义.但是在将这个虚拟实体设置为每个子实体的父实体后,我可以像以前那样完全保存它们,而不必过多关注事务.谢谢大家.

java google-app-engine entity jpa

6
推荐指数
1
解决办法
2650
查看次数

标签 统计

google-app-engine ×2

java ×2

jpa ×2

datanucleus ×1

entity ×1

spring ×1