【问题标题】:Google Web Toolkit (GWT) + Google App Engine (GAE) + Detached Data PersistenceGoogle Web Toolkit (GWT) + Google App Engine (GAE) + Detached Data Persistence
【发布时间】:2010-10-19 11:16:10
【问题描述】:

我想使用 GWT 和 GAE 开发一个需要数据持久性的网络应用程序。据我了解,我唯一(或至少到目前为止最方便的)数据持久性选项是 GAE 的 Datastore,它使用 JDO 或 JPA 注释对象。我还希望能够使用 GWT 远程过程调用 (RPC) 来回发送我的对象客户端-服务器,因此我的对象必须能够“分离”。但是,GWT RPC 序列化无法处理分离的 JDO/JPA 对象,而且它似乎不会在不久的将来。

我的问题:对此最简单和最直接的解决方案是什么?能够通过服务器端持久性共享相同的对象客户端/服务器将非常方便。

编辑

我应该澄清一下,我仍然希望将 GWT RPC 与 GAE 的数据存储区一起使用。我只是在寻找可以让所有这些技术协同工作的最佳解决方案。

【问题讨论】:

  • +1 用于使用基于 Web 的集群服务来实现本地数据持久性。 :-)
  • 在这里得到答案后,您会考虑分享您在这方面的进展吗? (请考虑选择最佳答案)

标签: google-app-engine gwt rpc google-cloud-datastore detach


【解决方案1】:

【讨论】:

【解决方案2】:

我最近发现了Objectify,它旨在替代JDO。使用它的经验不多,但它比 JDO 更易于使用,似乎更轻量级,并且声称可以通过 GWT 解决对 DTO 的需求,尽管我还没有尝试过该特定功能。

【讨论】:

    【解决方案3】:

    雷克伦威尔有一个temporary hack up。我已经尝试过了,它有效。

    它强制你使用 Transient 而不是 Detachable 实体,因为 GWT 不能序列化 DataNucleus 使用的隐藏 Object[];这意味着您发送给客户端的对象无法插入回数据存储区,您必须检索实际的数据存储区对象,并将所有持久字段复制回其中。 Ray 的方法使用反射来迭代方法,检索 getBean() 和 setBean() 方法,并将实体 setBean() 与瞬态 gwt 对象的 getBean() 一起应用。

    您应该努力使用 JDO,JPA 目前只不过是一个包装类。要使用此 hack,您必须为每个持久字段同时拥有 getter 和 setter 方法,对每个“bean”字段使用 PROPER getBean 和 setBean 语法。好吧,几乎正确,因为它假设所有 getter 都以“get”开头,而默认布尔字段使用是“is”。

    我已解决此问题并在 Ray 的博客上发表了评论,但正在等待批准,我不确定他是否会发布。基本上,我在 org.datanucleus 包中实现了一个 @GetterPrefix(prefix=MethodPrefix.IS) 注释来扩充他的工作。

    如果没有发布,这是一个问题,请发送电子邮件至 x_AT_aiyx_DOT_info 回复:@GetterPrefix for JDO,我会将修复程序发送给您。

    【讨论】:

      【解决方案4】:

      前段时间我写了一个帖子Using an ORM or plain SQL?

      这是去年在 GWT 中提出的 我正在写的应用程序。很多 从 EclipseLink 翻译到 服务中的表示对象 执行。如果我们使用 ibatis 会简单得多 创建适当的对象 ibatis 然后一路传过去 上下堆栈。一些纯粹主义者 可能会说这是 Bad™。也许是这样(在 理论)但我告诉你什么:它 会导致更简单的代码, 更简单的堆栈和更高的生产力。

      基本上符合你的观察。

      但这当然不是 Google App Engine 的选项,因此您几乎无法在客户端对象和您的 JPA 实体之间建立一个翻译层。

      JPA 实体非常严格,因此无论如何它们并不适合在客户端之间来回发送。通常,您在执行此操作时需要来自多个实体的少量位(因此最终会得到某种表示层值对象)。这就是你前进的道路。

      【讨论】:

        【解决方案5】:

        Try this。它是一个用于序列化 GAE 核心类型并将它们发送到 GWT 客户端的模块。

        【讨论】:

          【解决方案6】:

          您可以考虑使用 JSON。 GWT 有必要的 API 来在客户端解析和生成 JSON 字符串。你会得到很多用于服务器端的 JSON API。我尝试使用 google-gson,这很好。它将您的 JSON 字符串转换为 POJO 模型,反之亦然。希望这可以帮助您为您的要求提供一个体面的解决方案

          【讨论】:

            【解决方案7】:

            目前,我使用 DTO (DataTransferObject) 模式。不一定像干净和更多样板,但 GAE 目前仍需要相当数量的样板。 ;)

            我有一个域对象(通常)与 DTO 一对一映射。当客户端需要域信息时,DAO(DataAccessObject) 会生成域对象的 DTO 表示并通过网络发送。当 DTO 返回时,我将 DTO 交给 DAO,DTO 然后更新所有适当的域对象。

            显然不如直接通过网络传递域对象那么干净,但 GAE 的 JDO 实现和 GWT 的序列化过程的局限性意味着这是我目前处理这个问题的最干净的方式。

            【讨论】:

              【解决方案8】:

              我相信 Google 对此的官方回答是 GWT 2.1 RequestFactory。 鉴于您使用的是 GWT 和 GAE,我建议您坚持使用 Google 官方框架...我有一个类似的基于 GWT / GAE 的应用程序,这就是我正在做的事情。

              顺便说一句,设置 RequestFactory 有点让人头疼。当前的 Eclipse 插件不包括所有 jar,但我能够在 Stackoverflow 中找到我需要的帮助

              【讨论】:

                【解决方案9】:

                我也一直在使用 Objectify,我非常喜欢它。您仍然需要使用 pre/postLoad 方法进行一些跳舞来翻译,例如文本到字符串并返回。

                【讨论】:

                  【解决方案10】:

                  由于 GWT 最终编译为 JavaScript,因此对于分离的持久性,它需要一些可用的服务之一。最著名的是 HTML5 商店和 Gears(都使用 SQLite!)。当然,两者都没有被广泛部署,所以你必须说服你的用户要么使用现代浏览器,要么安装一个鲜为人知的插件。如果用户不遵守,请务必降级为可用子集

                  【讨论】:

                  • 通过分离,他们谈论的是在浏览器中发送休眠等增强的 dto 而不是持久性。
                  • 术语冲突的典型案例。
                  【解决方案11】:

                  直接使用Datastore API来加载/存储POJO域对象怎么样?

                  它应该与 DTO 方法相当,例如您必须手动处理所有字段(如果您不使用基于反射的自动化之类的技巧),同时它应该为您提供更大的灵活性和对所有 Datastore 功能的完全访问权限。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2016-12-29
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2014-08-09
                    • 2011-03-11
                    • 1970-01-01
                    • 2011-04-21
                    相关资源
                    最近更新 更多