Objectify是否有等效于Datastore.add()的方法,仅插入不存在的实体?
在Objectify中批量插入同一实体组的缺失实体
我完全懂你的需求:想批量给同一实体组插入实体,但只新增那些不存在的,现有实体绝对不能被覆盖。确实,Datastore原生的add()方法支持这种「仅插入缺失」的行为,但Objectify的save()默认对应put(),会直接覆盖现有实体,这就有点棘手了。不过咱们可以通过事务内查询+过滤的方式实现类似效果,而且因为是同一实体组,事务能完美保证操作的一致性。
下面是具体的实现思路和代码示例:
核心思路
- 开启事务:由于操作的是同一实体组,用Objectify的事务可以确保查询和插入的原子性,避免并发场景下的冲突(比如刚查完就有其他操作插入了相同实体)。
- 批量查询现有实体:先提取要插入实体的所有键,批量查询Datastore中已存在的实体。
- 过滤出缺失实体:对比要插入的实体列表和查询结果,筛选出那些在Datastore中不存在的实体。
- 仅保存缺失的实体:只把过滤后的缺失实体批量保存,完全不会碰现有数据。
代码示例
假设你的实体类是MyEntity,下面是完整的实现代码:
import com.googlecode.objectify.Objectify; import com.googlecode.objectify.ObjectifyService; import com.googlecode.objectify.Work; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class EntityBatchInserter { public void insertMissingEntities(List<MyEntity> entitiesToInsert) { // 提取所有待插入实体的Datastore键 List<com.google.appengine.api.datastore.Key> targetKeys = entitiesToInsert.stream() .map(ObjectifyService::keyFor) .collect(Collectors.toList()); // 在事务中执行查询+插入操作,保证原子性 ObjectifyService.ofy().transact(new Work<Void>() { @Override public Void run() { Objectify ofy = ObjectifyService.ofy(); // 批量查询已存在的实体,返回「键-实体」的映射 Map<com.google.appengine.api.datastore.Key, MyEntity> existingEntities = ofy.load().keys(targetKeys); // 筛选出不存在的实体 List<MyEntity> missingEntities = new ArrayList<>(); for (MyEntity entity : entitiesToInsert) { var entityKey = ObjectifyService.keyFor(entity); if (!existingEntities.containsKey(entityKey)) { missingEntities.add(entity); } } // 仅保存缺失的实体,避免覆盖现有数据 if (!missingEntities.isEmpty()) { ofy.save().entities(missingEntities).now(); } return null; } }); } }
关键细节说明
- 事务的必要性:同一实体组内的事务能保证「查询-过滤-插入」整个流程是原子的,不会被其他并发操作打断,彻底避免了数据不一致的风险。
- 批量操作的效率:
load().keys(targetKeys)和save().entities(missingEntities)都是批量RPC调用,比单个实体逐个操作高效得多,能大幅减少Datastore的请求次数。 - 键的唯一性:Datastore的键是实体的唯一标识,通过
ObjectifyService.keyFor(entity)获取键进行对比,是判断实体是否存在的核心依据。
如果你的实体组规模特别大,需要注意Datastore事务的超时限制(默认60秒),但只要批量操作的实体数量不是上万级别,这个方案完全够用。
内容的提问来源于stack exchange,提问作者noobNeverything
相关产品推荐
相关产品推荐

