0

apache.JDO /w DataNucleus を使用して小さなプロジェクトをセットアップしました。データは問題なく保存できるのですが、更新や削除しようとすると行き詰まりました。

シナリオは次のとおりです。

  1. オブジェクトを作成して永続化し、id を取得します
     @PrimaryKey  
     @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)  
     プライベート ロング ID。  
  1. PersistenceManager を閉じます
  2. アプリでオブジェクトを変更します (一時的)
  3. もう一度永続化しようとしましたが (id フィールドは同じです)、更新する代わりに、新しいオブジェクトが作成されます

Google App Engine では、同じシナリオで最新情報が得られました (予想される結果 - 以下を参照)。

私の問題を例示するために、小さなコードサンプルも提供します。

        PersistenceManager pm = PMF.getPM();
        Option dao = new Option(String.class, "field", "A");
        pm.makePersistent(dao);
        pm.close();

        System.out.println("1");
        for (オブジェクト o : Model.findAll(Option.class))
            System.out.println(((オプション) o).getValue());

        dao.setValue("B");

        午後 = PMF.getPM();
        pm.makePersistent(dao);
        pm.close();

        System.out.println("2");
        for (オブジェクト o : Model.findAll(Option.class))
            System.out.println(((オプション) o).getValue());

        午後 = PMF.getPM();
        pm.makePersistent(dao);
        pm.deletePersistent(dao);
        pm.close();

        System.out.println("3");
        for (オブジェクト o : Model.findAll(Option.class))
            System.out.println(((オプション) o).getValue());

出力は次のようになると思います。

1
あ
2
B
3

しかし、代わりにそれは私に与えます:

1
あ
2
あ
B
3
あ
B

私が間違っていることについて何か提案はありますか? (ところで、RetainValues を有効にして、非トランザクション RW を使用しています)

4

2 に答える 2

0

問題を解決しました(@point 2)

pm = PMF.getPM();
dao = pm.getObjectById(DO.class、1L);
dao.setValue( "B");
pm.makePersistent(dao);
pm.close();

ただし、フィールドが70〜100の場合、それぞれを個別に設定する必要があるため、このソリューションには多少のコストがかかります。

私は手動でそれを行っていませんが、リフレクションを使用しています-しかし、Hibernateに対するDataNucleusの利点は何ですか?-これは(私が知る限り)ランタイムイントロスペクションも使用します。

私が間違っている場合は訂正してください-私はまだこの分野の初心者です...まだ:)

于 2010-09-04T06:40:30.623 に答える