2010-08-30 60 views
0

我已经使用apache.JDO/w DataNucleus设置了一个小项目。我可以保存没有任何问题的数据,但在尝试更新或删除时遇到困难。如何使用JDO(DataNucleus)来更新和删除数据?

的场景是以下内容:

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

    回答

    0

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

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

    但这种解决方案是有点昂贵,如果我有70-100领域,因为我必须分开设置每一个。

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

    请纠正我,如果我错了 - 我仍然在这方面是新手...然而:)

    +3

    由于对象处于持久状态,因此不会再次调用makePersistent(),因此会自动检测到任何更新(与Hibernate不同 - 它必须计算出更改的内容)。而如果你有70-100个领域呢?你更新了一个,所以它更新了一个。 DN文档定义了哪些优点 – DataNucleus 2010-09-25 17:43:18

    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