java google app engine按键获取实体

时间:2012-12-27 17:57:35

标签: java google-app-engine entity jdo

使用GAEJ和JDO存储数据时遇到问题。 这就是我正在使用的:

类Usuari.java:

@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;

@Persistent
private String email;

@Persistent
private String rol="";

类DBUtils.java: 我尝试了两种执行删除操作的方法:

// This method removes a record from the database using its unique Key
public static boolean eliminar(Key k) throws Exception {
    PersistenceManager pm = PMF.get().getPersistenceManager();
    String kind;
    Long id;
    kind = k.getKind();
    id = k.getId();
    try {
        if (k.getKind().equals("Usuari")) {
            Usuari u = (Usuari)pm.getObjectById(k);
            pm.deletePersistent(u);
            _log.log(Level.INFO, "Deleted an entity->kind: " + kind + " id: " + id);
        }

        return true;
    } catch (Exception e) {
        _log.log(Level.SEVERE, "Unable to delete an entity->kind: " + kind + " id: " + id);
        System.err.println(e.getMessage());
        throw e;
    }
    finally {
        pm.close();
    }
}

// This method removes a record from the database using its unique Key - too
public static void eliminar2(Key k) throws Exception {
    PersistenceManager pm = PMF.get().getPersistenceManager();
    javax.jdo.Transaction tx = pm.currentTransaction();
    try
    {
        tx.begin();
        if (k.getKind().equals("Usuari")) {
            Usuari u = (Usuari) pm.getObjectById(k);
            pm.deletePersistent(u);
        }
        tx.commit();
    }
    catch (Exception e)
    {
        if (tx.isActive())
        {
            tx.rollback();
        }
        throw e;
    }
}

我能够创建一些类“Usuari”的新实例,但我无法删除它们。 每当我调用“eliminar”或“eliminar2”方法时,我会因尝试获取它而获得“无此对象”。我已手动检查,我看到对象存在于我的管理面板中,其ID和KIND,所以我不知道我做错了什么。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

根据JDO规范,

PM.getObjectById不接受Key对象。它接收一个身份对象,与pm.getObjectId(obj)中的对象类型相同;建议你浏览一下JDO规范。毫无疑问,如果您检查了从此方法返回的内容,您会发现它无法找到具有该“身份”的对象,因为密钥不是标识。你也可以

pm.getObjectById(Usuari.class, key);

在GAE文档中非常清楚地显示。

仍然不明白为什么用户将@Persistent放在每个字段上几乎每个类型都是默认持久性的;只会导致代码更难以理解。