【问题标题】:appengine datastore change entities propertyappengine 数据存储更改实体属性
【发布时间】:2012-03-19 21:17:23
【问题描述】:

我想将实体属性从 String 更改为 long。我已经看到尼克在Change IntegerProperty to FloatProperty of existing AppEngine DataStore 中回答了类似的问题,但我正在用 Java 编写并且需要一些代码示例,因为我对 mapreduce 一无所知。

例如我们要将 userId 从 String 更改为 this class 的 Long。

我还想就我将日期存储为 long 而不是 String 的想法获得建议,以便可以从 android、GWT 等(通过 Rest Json 或 RPC)轻松使用时间信息。目前,GWT 没有 Jodatime,它对 Java.util.Date 和解析的支持有限。

【问题讨论】:

    标签: java google-app-engine google-cloud-datastore jdo jodatime


    【解决方案1】:

    如果你真的想从String转换为Long,除了使用原始GAE编写转换sn-p之外,我看不到任何其他选择,例如:

    import com.google.appengine.api.datastore.DatastoreServiceFactory;
    import com.google.appengine.api.datastore.Entity;
    import com.google.appengine.api.datastore.PreparedQuery;
    import com.google.appengine.api.datastore.Query;
    
    Query q = new Query (Task.class.getName());
    PreparedQuery pq = DatastoreServiceFactory.getDatastoreService ().prepare (q);
    for (Entity entity : pq.asIterable ())
    {
        String orig = entity.getProperty ("userId").toString ();
        entity.removeProperty ("userId");
        entity.setProperty ("userId", Long.parseLong (orig));
    }
    

    【讨论】:

    • 虽然我有很多数据条目,但代码没有进入 for 循环。
    • "MyKind" 是一个字符串,区分大小写。
    • 我已经更新了问题(还有你的代码 sn-p,它还没有经过同行评审。)以使用 Task.java 作为示例。所以,代替“MyKind”,我已使用 Task.class.getName() 但它跳过了 for 循环。
    • 查询构造函数的参数应该与您在仪表板中使用 GQL 在数据存储查看器中运行的参数相同,例如:SELECT * FROM Task。参数区分大小写。
    • hmmm... 我尝试了几个变体 "select from " + Task.class.getName() + " where userId!=null""SELECT * FROM Task WHERE userId!=null" 并且由于查询似乎已经包含“SELECT * FROM”,我只是尝试 "Task WHERE userId!=null" 它仍然无法正常工作。
    【解决方案2】:

    你的持久化接口是什么? JDO(我的)、JPA、Objectify、Twig、原始 GAE/J API?我认为没有多少人可以在不知道这一点的情况下给你一个代码示例。

    另外,请提供您现有(我认为是基础日期时间)持久实体的代码摘录,包括您谈论的数据成员。

    【讨论】:

    • 很抱歉。我来自为 android 开发,对此了解不多。我相信它是JDO。我已经从谷歌 IO 演示项目中迭代了我的代码。 code.google.com/p/cloud-tasks-io/source/browse/trunk/… 关于日期时间,我将其存储为字符串并在操作之前对其进行解析以供进一步使用。它不是显示给人类,而是计算结束时间。因此,我想知道将其存储为 long 开始是否是个好主意。
    【解决方案3】:

    您的班级使用的是 JPA 而不是 JDO。 GAE JPA 插件的最新版本 (v2.x) 允许将 (java.util.)Date 持久化为 Long 或 String。这不适合您的数据迁移(请参阅 Jonathan 的回复),但允许您将未来的日期字段保留为 Long。 IIRC,您可以指定“jdbcType”(DataNucleus 扩展注释),因为 INTEGER 会触发它。

    【讨论】:

    • 实际上,我认为,它是 JDO。在我的项目中,我找到了这个配置文件 war/WEB-INF/classes/META-INF/jdoconfig.xml 我正在使用最新的谷歌 GAE 插件 你能告诉我为什么乔纳森的建议不起作用吗?代码通过循环,但数据存储永远不会改变。我试图像 DatastoreServiceFactory.getDatastoreService().put(entity); 这样保存实体,但它仍然无法正常工作。
    • 那么为什么你的课堂上都有@Entity 等呢?持久化代码在哪里? pm.makePersistent? em.persist?
    • 看来 google 使用 @Entity 无论是 JPA 还是 JDO developers.google.com/web-toolkit/doc/latest/… 我做 pm.makePersistent。
    • 嗯...它正在本地 GAE 开发服务器上运行。我记得的唯一变化是谷歌插件更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    相关资源
    最近更新 更多