在Google appengine java中是否可以从id重现密钥?

时间:2013-06-24 21:04:18

标签: java google-app-engine

我的app-engine服务器从客户端数据创建一个实体,并返回(通过RPC回调)从其密钥派生的实体id。在另一个事件中,我正在尝试[并且未能]基于id删除实体,即从id创建密钥并删除原始实体。

是否可以从id中重现原始密钥?

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

这是我的RemoteServiceServlet:

  

import java.util.Date;   import java.util.List;

     

import gid.mff.item_manager.client.I_MFF_ItemService;   import gid.mff.item_manager.client.mffobjects.MFF_Item1;

     

导入com.google.appengine.api.datastore.DatastoreService;   import com.google.appengine.api.datastore.DatastoreServiceFactory;   import com.google.appengine.api.datastore.Entity;   import com.google.appengine.api.datastore.FetchOptions;   import com.google.appengine.api.datastore.Key;   import com.google.appengine.api.datastore.KeyFactory;   import com.google.appengine.api.datastore.Query;   import com.google.gwt.user.server.rpc.RemoteServiceServlet;

     

public class ItemServiceImpl extends RemoteServiceServlet实现了I_MFF_ItemService   {       private static final String 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;
}

}

1 个答案:

答案 0 :(得分:3)

您可以使用generating keys选项使用其种类和ID获取实体的密钥。

在您的情况下,在创建实体时,您已使用构造函数

new Entity(kind,Key) 

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

现在要删除实体,您将使用选项

创建密钥
createKey(kind, id)

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

createKey(Key, kind, id)

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

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

new Entity(Key)

检查entity constructor detailsKeyFactory method以便更好地理解这一点。

修改 以上解决方案按照Rubber Duck工作,因此在他使用的更正步骤下添加访问所需的删除实体

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

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

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