如何使用JDO(DataNucleus)更新和删除数据?

问题描述 投票:0回答:2

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

方案如下:

  1. 我创建了一个对象并坚持它,它得到并且id
     @PrimaryKey  
     @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)  
     private Long 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(((Option) 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(((Option) 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(((Option) o).getValue());

我希望输出为:

1
A
2
B
3

但相反,它给了我:

1
A
2
A
B
3
A
B

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

java jdo datanucleus
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的优势是什么? - 据我所知,它也使用运行时内省。

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


0
投票

你不需要再次打电话给makePersistent

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 docs

© www.soinside.com 2019 - 2024. All rights reserved.