【问题标题】:Can't find the entities persisted with objectify in the datastore view在数据存储视图中找不到使用 objectify 持久化的实体
【发布时间】:2018-11-24 12:40:50
【问题描述】:

我在 Google Cloud 上有一个非常简单的带有 objectify 的 hello world 应用程序。

我正在使用最新的 Google Cloud Tools (1.6.1) for eclipse (Oxygen 4.7.3a)、Java 8 并运行数据存储模拟器(如 Elliotte's answer 中所述)

我能够保存一些实体并且我可以告诉它们它们是持久的,因为我可以在重新启动模拟器后检索它们并且我知道它们存储在:“C:\Users\XXXX\AppData\Roaming\gcloud\emulators\数据存储\WEB-INF\appengine-generated"

但是我在任何命名空间下的数据存储视图中都找不到这些实体。知道我在这里缺少什么吗?

空数据存储视图:

代码:


  public void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws IOException {

      Car porsche = new Car("2FAST", 4);
      ofy().save().entity(porsche).now();    // async without the now()

      assert porsche.id != null;    // id was autogenerated

      Car fetched2 = ofy().load().type(Car.class).id(porsche.id).now();

      Query cars = ofy().load().type(Car.class).chunkAll();

    response.setContentType("text/plain");
    response.setCharacterEncoding("UTF-8");

    response.getWriter().print("Hello App Engine!\r\n");

    response.getWriter().print(fetched2.id + " " + fetched2.license);


    response.getWriter().print("\ncars.count():" + cars.count() + "\n");
    List carsList = cars.list();
    for(Car c :carsList) {
        response.getWriter().println(c.id + " " + c.license);
    }


    String namespace = NamespaceManager.get();
    response.getWriter().println();
    response.getWriter().println("namespace: ");

  }

运行模拟器:

运行配置:

【问题讨论】:

    标签: java eclipse google-app-engine google-cloud-datastore objectify


    【解决方案1】:

    本地管理数据存储页面由本地开发服务器提供,它似乎只会在开发服务器本身以独立模式执行数据存储模拟时显示有效信息。即没有连接到数据存储模拟器,如果您没有设置连接到模拟器所需的环境,就会发生这种情况。在数据存储模拟器出现之前,这曾经是唯一的操作模式。

    在使用数据存储模拟器时,我没有找到访问等效/相似信息的方法,Running the Cloud Datastore Emulator 中没有提到此类功能。只有数据存储模拟器可以可靠地提供此类信息,因为它可以同时为多个开发服务器/应用程序(不知道彼此的存在)提供服务。

    如果您不需要运行共享同一数据存储的多个开发服务器(Is it possible to start two dev_appserver.py connecting to the same google cloud datastore emulator? 的反面),那么您可以简单地在启动开发服务器之前不设置 DATASTORE_EMULATOR_HOST 环境变量并且不传递 @ 987654326@ 给它 - 然后开发服务器将使用自己的数据存储仿真,您应该在其管理页面中看到信息。

    请注意,数据存储模拟器可能使用了与开发服务器不同的数据内部格式,如果您返回可能会导致问题,您可能需要清除 C:\Users\XXXX\AppData\Roaming\gcloud\emulators\datastore 存储目录,恢复以前的格式或使用备用目录。来自Migrating to the Cloud Datastore Emulator

    目前,本地 Datastore 模拟器将数据存储在 sqlite3 中,而 Cloud Datastore Emulator 将数据存储为 Java 对象。

    当使用旧的 sqlite3 数据启动 dev_appserver 时,数据将 转换为 Java 对象。原始数据备份与 文件名 {original-data-filename}.sqlitestub.

    【讨论】:

    • 我很困惑。我正在手动运行数据存储模拟器以使事情正常运行,但我喜欢使用开发服务器数据存储仿真(就像它曾经使用旧的好插件来 eclipse 一样)。有没有办法做到这一点并从数据存储查看器中受益?
    • 抱歉,如果我的理解不正确,您想将数据存储模拟器与 dev_app 服务器模拟器一起使用吗?也许您只需要在本地机器上运行这两个进程?
    • 我不太喜欢模拟器。我只想能够在本地测试我的应用程序,就像它曾经使用旧的好插件来 eclipse 一样。接受您的建议并删除 DATASTORE_EMULATOR_HOST 设置确实有帮助,现在我可以在本地开发数据存储控制台中看到数据。但仅适用于低级 API。我仍然看不到 Objectify。好吧,我想这是另一个问题的问题......
    • 开发服务器中的嵌入式Datastore模拟器和gcloud模拟器是两个不同的模拟器,相互独立。好像您正在使用 Objectify 6。Objectify 6 要求您使用 gcloud Datastore 模拟器。如果您仍然想使用嵌入在开发服务器中的模拟器,我认为您的选择是降级到 Objectify 5。无论您使用 Google Plugin for Eclipse(已弃用的插件)还是 Cloud Tools for Eclipse 什么时候使用 Objectify 5。您可能还想检查github.com/objectify/objectify/wiki/UpgradeVersion5ToVersion6
    猜你喜欢
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    相关资源
    最近更新 更多