【问题标题】:In Google appengine java Is it possible to reproduce a key from an id?在 Google appengine java 中是否可以从 id 复制密钥?
【发布时间】:2013-06-24 21:04:17
【问题描述】:

我的应用引擎服务器从客户端数据创建一个实体,并返回(通过 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.RemoteServiceServlet;

公共类 ItemServiceImpl 扩展 RemoteServiceServlet 实现 I_MFF_ItemService { 私有静态最终字符串 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;
}

}

【问题讨论】:

    标签: java google-app-engine


    【解决方案1】:

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

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

    new Entity(kind,Key) 
    

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

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

    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);

    然后用这个键删除需要的实体

    【讨论】:

    • 我已经在我编写的代码中使用了此链接信息,但它不起作用重新创建的密钥不会删除实体。我正在使用创建密钥和正确的 id 我做错了什么?
    • tony - 谢谢这是超级有建设性的,它对我有用。考虑将此代码添加到您的答案中: Key parent = KeyFactory.createKey("MffItems", MFF_ITEM1_ROOT_KEY); Key key = KeyFactory.createKey(parent, "Item1", id);
    猜你喜欢
    • 2019-06-08
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 2011-10-26
    • 2010-11-30
    相关资源
    最近更新 更多