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

时间:2010-08-30 22:31:24

标签: java jdo datanucleus

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

方案如下:

  1. 我创建了一个对象&坚持下去,它得到并且id
  2.      @PrimaryKey  
         @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)  
         private Long id;  
    
    1. 我关闭了PersistenceManager
    2. 在应用程序中我修改了我的对象(瞬态)
    3. 我尝试再次坚持(id字段是相同的),但不是更新它导致创建新对象
    4. 在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)

2 个答案:

答案 0 :(得分:0)

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

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

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

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

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

答案 1 :(得分:0)

您不需要致电makePersistent agian。

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