2015-12-30 37 views
0

我正在開發應用程序引擎的代碼。我試圖通過更新查詢結果返回的相同實體來更新現有行。但它會創建新的行而不是更新同一行。以下是代碼:Appengine實體更新不起作用

public boolean updateProfile(DbProfile profile) { 

Transaction txn = _datastore.beginTransaction(); 
Entity entity = getProfileEntity(profile.getLoginId()); 
if (entity != null) { 
    entity.setProperty(DbProfile.DbProfilePropertyNames.address, profile.getAddress()); 
    entity.setProperty(DbProfile.DbProfilePropertyNames.name, profile.getName()); 
    Key key = _datastore.put(entity); 
    txn.commit(); 
    return true; 
} 
return false; 
} 

private Entity getProfileEntity(String userName) { 

Key eRecommendationKey = KeyFactory.createKey("eRecommendation", _dbKeyName); 
FilterPredicate predicateUsername = 
    new FilterPredicate(DbProfile.DbProfilePropertyNames.loginId, FilterOperator.EQUAL, 
       userName.toUpperCase()); 
Query query = 
    new Query(DbProfile.entityProfileName, eRecommendationKey).setFilter(predicateUsername); 
List<Entity> profiles = 
     _datastore.prepare(query).asList(FetchOptions.Builder.withDefaults()); 
Utils.log.log(Level.SEVERE, "not found"+profiles.size()); 
if (profiles.size() == 0) { 
    //profile data is not set yet 
    return null; 
} else { 
    return profiles.get(0); 
} 
} 

下圖顯示了實體中的字段。 enter image description here

請讓我知道我該如何解決這個問題。

+0

什麼是_dbKeyName? –

回答

0

我解決了這個問題。這是我的錯誤。我曾調用saveData servlet而不是updateProfile servlet。

0

我的Java技能不太好,所以我覺得很難理解你的代碼示例。我也看不到在哪裏調用updateProfile()以及代碼如何獲取或構建配置文件對象,特別是配置文件對象的關鍵點是否被更改。

但一般情況下,如果創建新實體而不是更新現有實體,原因是更新提交時的密​​鑰與現有實體的實際密鑰不同。

典型情況:

  • 一個字符串(鍵名稱),使用的而不是整數(ID),或者反之亦然
  • 在密鑰
  • 不同的命名空間的種類名稱的錯字或關鍵
  • 家長的應用程序屬性中缺少關鍵路徑或錯誤地構建

建議:

在數據存儲區查看器中,將現有實體的密鑰與意外創建的實體的密鑰進行比較。兩個鍵之間的區別可能會給你一個提示,在代碼中尋找bug。