0

GAEJとJDOを使用してデータを保存する際に問題が発生しました。これは私が取り組んでいるものです:

クラスUsuari.java:

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

@Persistent
private String email;

@Persistent
private String rol="";

class DBUtils.java:削除操作を行う2つの方法を試しました。

// 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とともに管理パネルに存在することがわかりました。そのため、何が間違っているのかわかりません。

どんな助けでも大歓迎です。

4

1 に答える 1

0

PM.getObjectByIdKeyJDO仕様に従って、オブジェクトを取り込みません。;から取得するのと同じタイプのIDオブジェクトを取り込みます。pm.getObjectId(obj)JDO仕様を一瞥することをお勧めします。このメソッドから返されるものを調べた場合、キーはIDではないため、その「ID」を持つオブジェクトを見つけることができないことがわかります。あなたもすることができます

pm.getObjectById(Usuari.class, key);

これはGAEのドキュメントに非常に明確に示されています。

それでも、ユーザーがすべてのフィールドに@Persistentを配置している理由はわかりません。事実上、すべてのタイプがデフォルトで永続的です。コードを読みにくくするだけです。

于 2012-12-27T19:00:22.680 に答える