0

我已经使用 apache.JDO /w DataNucleus 建立了一个小项目。我可以在没有任何问题的情况下保存数据,但是在尝试更新或删除它们时我卡住了。

场景如下:

  1. 我创建一个对象并坚持它,它得到和 id
     @首要的关键  
     @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 (Object o : Model.findAll(Option.class))
            System.out.println(((选项) o).getValue());

        dao.setValue("B");

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

        System.out.println("2");
        for (Object o : Model.findAll(Option.class))
            System.out.println(((选项) o).getValue());

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

        System.out.println("3");
        for (Object o : Model.findAll(Option.class))
            System.out.println(((选项) o).getValue());

我希望输出是:

1
一种
2
乙
3

但相反,它给了我:

1
一种
2
一种
乙
3
一种
乙

关于我做错了什么的任何建议?(顺便说一句,我使用非事务性 RW,启用了 RetainValues)

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 个字段,这个解决方案会有点昂贵,因为我必须单独设置每个字段。

我没有手动完成,而是通过反射 - 但是 DataNucleus 相对于 Hibernate 的优势是什么?- (据我所知)也使用运行时内省。

如果我错了,请纠正我 - 我还是这个领域的新手......但是:)

于 2010-09-04T06:40:30.623 回答
0

你不需要打电话给makePersistentagian。

long id = objectId; //Id of the object you want to update.

pm = PMF.getPM();

DO dao = pm.getObjectById(DO.class, id);
dao.setValue("B");

pm.close();

要删除,请执行此操作;

long id = objectId; //Id of the object you want to delete.
pm = PMF.getPM();

DO dao = pm.getObjectById(DO.class, id);
pm.deletePersistent(dao);

pm.close();

您没有使用事务提交。您可以查看DataNucleus 文档

于 2018-01-01T16:27:24.170 回答