GAE Datastore中contactKey空值处理及重复写入问题咨询
解决GAE Datastore中JDO contactKey的null处理与重复写入问题
嘿,这个场景我之前用GAE Datastore + JDO开发时也碰到过,给你几个实用的方案,让你不用纠结null值,还能避免重复写入:
1. 搞定null导致的空指针异常
直接用equals()比较null和Key肯定会触发空指针,所以我们需要一个安全的比较方法,不管两边是不是null都能正常判断相等性。不想引入额外依赖的话,自己写个工具方法超简单:
private boolean areKeysEqual(Key a, Key b) { if (a == null && b == null) return true; if (a == null || b == null) return false; return a.equals(b); }
以后所有需要比较contactKey的地方,都用这个方法代替直接的equals(),再也不会有空指针问题了。
2. 避免重复写入:只在值变化时更新
既然方法会被频繁调用,我们可以在设置contactKey时先判断当前值和新值是否一致——如果完全相同,直接跳过持久化操作;只有值发生变化时才更新并保存。
把这个逻辑封装到实体类的setter方法里,调用方完全不用关心内部细节:
public class YourEntity { @Persistent private Key contactKey; // 可选:添加乐观锁版本,防止并发更新冲突 @Version private Long version; public void setContactKey(Key newContactKey) { // 先安全比较当前值和新值 if (areKeysEqual(this.contactKey, newContactKey)) { return; // 值没变化,不用做持久化操作 } // 值发生变化,更新并保存 this.contactKey = newContactKey; // 获取PersistenceManager并执行持久化(假设你有PM获取工具类) PersistenceManager pm = PMF.get().getPersistenceManager(); try { pm.makePersistent(this); } finally { pm.close(); } } private boolean areKeysEqual(Key a, Key b) { if (a == null && b == null) return true; if (a == null || b == null) return false; return a.equals(b); } }
3. 额外保障:用乐观锁防止并发冲突
如果你的应用存在并发更新场景,建议给实体加上@Version注解(如上面代码所示)。JDO会自动管理版本号,当两个请求同时更新同一实体时,只有第一个会成功,第二个会抛出JDOOptimisticVerificationException——既能避免脏数据,也能减少无效的重复写入。
这样一来,不管contactKey是null还是有效Key,调用setContactKey()时都不用额外判断,方法内部会自动处理相等性检查和必要的持久化,完美解决你的问题!
内容的提问来源于stack exchange,提问作者Udhaya
相关产品推荐
相关产品推荐

