java - Google App Engine - 无法在单个事务中对多个实体组进行操作

标签 java spring google-app-engine jpa datanucleus

如果两个实体的类型都是 PersistentLogin,为什么我会收到以下异常?我认为这意味着它们在同一个实体组中,但我想这是一个错误的假设。有什么解决办法吗?

这是代码:

// the class is marked with @Transactional
@Override
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);
    }
}

这是异常(exception)情况:

Caused by: javax.persistence.PersistenceException: Illegal argument
    at org.datanucleus.jpa.NucleusJPAHelper.getJPAExceptionForNucleusException(NucleusJPAHelper.java:260)
    at org.datanucleus.jpa.EntityTransactionImpl.commit(EntityTransactionImpl.java:122)
    at org.datanucleus.store.appengine.jpa.DatastoreEntityTransactionImpl.commit(DatastoreEntityTransactionImpl.java:50)
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:467)
    ... 42 more
Caused by: java.lang.IllegalArgumentException: can't operate on multiple entity groups in a single transaction. found both Element {
  type: "PersistentLogin"
  name: "1WfCYx8bmwUGkjzP2PpmFA=="
}
 and Element {
  type: "PersistentLogin"
  name: "SfI0P8RVBjTvu0WHMSuaVA=="
}

最佳答案

同一实体组意味着实体具有共同的父实体。

两个顶级实体永远不会在同一个实体组中。

Any ideas how to fix this?

最简单的方法就是放宽交易要求。在您的情况下,这意味着一个一个地删除 PersistentLogin 实体(尽力而为循环,尽可能多地删除,重试错误,不保证原子性)。

如果您想将同一用户的 PersistentLogin 放在同一实体组中,则需要对数据模型进行相当大的更改,这对整体性能的影响不确定。

对于非关系数据库,您必须在不依赖数据存储上的事务的情况下编写应用程序代码。他们只是没有像我们已经习惯的那样支持他们。

关于java - Google App Engine - 无法在单个事务中对多个实体组进行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2323777/

相关文章:

java - AM/PM 的 SimpleDateFormat 解析错误

递归爬楼梯拼图的 Java 基准测试

java - spring MVC中的层结构

java - 是否有可用的 Google App Engine 源代码和 JavaDoc JAR bundle ?

google-app-engine - 由于 java.lang.NoClassDefFoundError GWT 导致无法初始化类

java - Android viewholder 类范围广

java - 无法在已检查的异常上回滚事务

java - Hibernate 3.6.0.Final ClassNotFoundException ReflectionManager

google-app-engine - 电子邮件 API 授权发件人

java - 如何计算到某个日期的剩余时间