我正在为app引擎开发代码。我尝试通过更新作为查询结果返回的同一实体来更新现有行。但它创建了新行而不是更新同一行。以下是代码:
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);
}
}
请告诉我如何解决问题。
答案 0 :(得分:0)
我的Java技能不太好,所以我发现很难理解你的代码示例。我也没有看到调用updateProfile()
的位置以及代码如何获取或构建配置文件对象,尤其是配置文件对象的键是否被更改。
但一般来说,如果创建新实体而不是更新现有实体,原因是更新提交时的密钥与现有实体的实际密钥不同。
典型情况:
建议:
在数据存储区查看器中,将现有实体的密钥与意外创建的实体的密钥进行比较。两个键之间的区别可能会提示您在代码中查找错误。
答案 1 :(得分:0)
我解决了这个问题。这是我的错。我调用了saveData servlet而不是updateProfile servlet。