在Google appengine java中,是否可以从id中复制密钥



我的应用程序引擎服务器从客户端数据创建一个实体,并返回(通过RPC回调)从其密钥派生的实体id。在另一个事件中,我尝试[但失败]基于id删除实体,即从id创建密钥并删除原始实体。

有可能从id中复制原始密钥吗?

如果没有,我应该如何从客户端删除实体?

这是我的RemoteServiceServlet:

导入java.util.Date;导入java.util.List;

导入gid.mff.item_manager.client.I_mff_ItemService;导入gid.mff.item_manager.client.mffobjects.mff_Item1;

导入com.google.appengine.api.datastore.DatastoreService;导入com.google.appengine.api.datastore.DatastoreServiceFactory;导入com.google.appengine.api.datastore.Entity;导入com.google.appengine.api.datastore.FetchOptions;导入com.google.appengine.api.datastore.Key;导入com.google.appengine.api.datastore.KeyFactory;导入com.google.appengine.api.datastore.Query;导入com.google.gwt.user.server.rpc远程服务Servlet;

公共类ItemServiceImpl扩展RemoteServiceServlet实现I_MFF_ItemService{private静态最终字符串MFF_ITEM1_ROOT_KEY="MFF_ITEM1_ROOT_KEY";

private final static String LOG = "I_MFF_ItemService";
@Override
public MFF_Item1 getItem(long id) 
{
    //TODO get one from the data store
    System.out.println("the id is: " + id);
    MFF_Item1 m = new MFF_Item1();
    m.setTitle("corck");
    m.setId(10);
    return m;
}
@Override
public Long createItem(MFF_Item1 mff_Item1) 
{
    Key itemListKey = KeyFactory.createKey("MffItems", MFF_ITEM1_ROOT_KEY);
    Date date = new Date();
    Entity item = new Entity("Item1", itemListKey);
    item.setProperty("date", date);
    item.setProperty("header", mff_Item1.getTitle());
    DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
    datastore.put(item);
   printItems(datastore, itemListKey);
    return item.getKey().getId();
}
private void printItems(DatastoreService datastore, Key itemListKey) 
{
     Query query = new Query("Item1", itemListKey).addSort("header", Query.SortDirection.DESCENDING);
        List<Entity> items = datastore.prepare(query).asList(FetchOptions.Builder.withLimit(40));
        for(Entity e: items)
        {
          System.out.print("The Header is: " + e.getProperty("header"));
          System.out.println("   The key id is: " + e.getKey().getId());
        }
}
@Override
public boolean deleteItem(Long id) 
{
    System.out.println(LOG +" delete item with this id: " + id);
    DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
    Key key = KeyFactory.createKey("MffItems", id);
    datastore.delete(key);

    // TODO Auto-generated method stub
    return true;
}

}

您可以使用生成密钥选项来使用实体的种类和id获取实体的密钥。

在您的案例中,在创建实体时,您使用了构造函数

new Entity(kind,Key) 

这将创建一个给定类型的实体,该实体具有给定键的父级和将由数据存储自动生成的数字ID。因此,密钥将被用作祖先密钥,而不是实体密钥

现在要删除实体,您正在使用选项创建密钥

createKey(kind, id)

这将创建一个没有父项、具有给定种类和id的密钥。但为了正确访问您的实体,您应该使用:

createKey(Key, kind, id)

这将创建一个具有给定祖先密钥、种类和id 的密钥

如果最初在创建实体时,您打算将生成的密钥用作实体密钥,而不是祖先密钥,那么您应该使用:

new Entity(Key)

检查实体构造函数的详细信息和KeyFactory方法以更好地理解这一点。

编辑:上述解决方案已按照Rubber Duck工作,因此在下面添加了他用于访问删除所需实体的更正步骤

为父项创建密钥:Key parent = KeyFactory.createKey("MffItems", MFF_ITEM1_ROOT_KEY);

使用创建的父级密钥、种类和id为实体创建密钥:Key key = KeyFactory.createKey(parent, "Item1", id);

然后使用此键删除所需的实体

最新更新