17

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

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

编辑

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

4

11 回答 11

7

尝试使用http://gilead.sourceforge.net/

于 2009-05-09T17:10:53.750 回答
5

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

于 2010-03-07T18:57:28.813 回答
5

雷克伦威尔有一个临时的破解。我已经尝试过了,它有效。

它迫使您使用 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,我会将修复程序发送给您。

于 2009-05-14T10:02:54.723 回答
3

前段时间我写了一篇文章Using an ORM or plain SQL?

这在去年我正在编写的一个 GWT 应用程序中出现。服务实现中从 EclipseLink 到表示对象的大量转换。如果我们使用的是 ibatis,那么使用 ibatis 创建适当的对象然后在堆栈中上下传递它们会简单得多。一些纯粹主义者可能会认为这是 Bad™。也许是这样(理论上),但我告诉你:它会导致更简单的代码、更简单的堆栈和更高的生产力。

这基本上符合你的观察。

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

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

于 2009-04-14T23:01:36.157 回答
3

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

于 2009-07-22T12:37:04.623 回答
2

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

于 2009-05-01T21:39:31.127 回答
2

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

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

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

于 2010-01-04T15:39:23.903 回答
2

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

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

于 2010-12-23T23:31:25.713 回答
1

我也一直在使用 Objectify,我非常喜欢它。您仍然需要使用 pre/postLoad 方法进行一些跳舞,以将例如 Text 转换为 String 并返回。

于 2010-05-03T22:49:19.427 回答
0

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

于 2009-04-14T22:29:13.397 回答
0

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

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

于 2010-01-14T20:10:21.120 回答