2009-09-08 58 views
2

因此,我正在使用Wicket創建一個小型Web應用程序,該應用程序將在Google應用程序引擎上運行。我使用的是JDO,到目前爲止持續數據(插入)或查詢數據的相同數據對象沒有問題。也許我錯過了一些基本的東西,我試圖採取其中一個持久對象,更改兩個值,然後我希望修改後的對象在數據存儲中更新。使用JDO和GAE更新對象

我有一個持久的用戶對象。我可以查詢這個,所以我知道對象本身有正確的註釋。

我正在更新它的代碼是:

final PersistenceManager pm = PMF.get().getPersistenceManager(); 
Transaction trans = pm.currentTransaction(); 
try{ 
    trans.begin(); 
    user.setLoginCount(user.getLoginCount()+1); 
    user.setLastLoginTime(new Date()); 
    trans.commit(); 
}finally{ 
    if (trans.isActive()) { 
    trans.rollback(); 
    System.out.println("----transaction rollback - submitLogin----"); 
    } 
    pm.close(); 
} 

這裏是我的用戶對象註解這兩件事情我想改變...

@Persistent 
private Date lastLoginTime; 

@Persistent 
private int loginCount = 0; 

我做了正確的查詢在此代碼之後,它在我更改值之前返回相同的對象。
任何想法我做錯了什麼?

回答

2

默認情況下,JDO對象僅在創建它們的PersistenceManager打開時纔有效。 你說你已經在用戶對象上調用了makePersistent()。這意味着您在上面的代碼中向我們顯示的那個之前打開了另一個PersistenceManager。當你關閉PersistenceManager(大概你關閉了它),你的對象變得無效(非正式地說)。

根據你想要做什麼,你有兩個選擇。

  1. 您可以detach用戶對象,這將允許它有它的內容以外的生活的原始持久性管理。

  2. 你可以使用你剛剛創建

這裏的新的PersistenceManager對象的新副本是選項#2一些代碼:

trans.begin(); 
User user = (User) pm.getObjectById(User.class,"userkeyhere"); 
user.setLoginCount(user.getLoginCount()+1); 
user.setLastLoginTime(new Date()); 
trans.commit(); 
+0

感謝,這正是我正在尋找。我打電話pm.makePersistant()將對象添加到數據存儲,然後pm.close()並在應用程序中使用我的對象。然後我創建了一個新的pm,並嘗試使用它來更新對象。現在,我只需再次獲取對象並複製字段。似乎工作。 – Nick 2009-09-09 12:51:52