2010-08-30 59 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