【问题标题】:How to use JDO(DataNucleus) to Update & Delete data?如何使用 JDO(DataNucleus) 更新和删除数据?
【发布时间】:2010-08-30 22:31:24
【问题描述】:

我使用 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)

【问题讨论】:

    标签: java jdo datanucleus


    【解决方案1】:

    我已经解决了我的问题(@point 2)

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

    但是,如果我有 70-100 个字段,这种解决方案会有些昂贵,因为我必须分别设置每个字段。

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

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

    【讨论】:

    • 你不会再次调用 makePersistent(),因为对象处于持久状态,所以会自动检测到任何更新(与 Hibernate 不同 - 它必须找出更改的内容)。如果你有 70-100 个字段呢?你更新了一个,所以它更新了一个。 DN 文档定义了什么是优势
    【解决方案2】:

    您无需致电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 docs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多