2

我想用 GWT-RPC 将休眠对象传输到前端。当然我不能转移带注释的类,因为注释不能编译成javascript。所以我纯粹在“.hbm.xml”中进行了休眠映射。这适用于非常简单的对象。但是,一旦我添加了更复杂的东西,例如用集合实现的 oneToMany 关系,编译器就会抱怨集合的一些序列化问题(但集合中的对象也是可序列化的)。

我猜它不起作用,因为hibernate创建了某种不能被GWT解释的特殊集合?

有什么办法可以解决这个问题,还是我需要另一种方法来让我的对象到达前端?

编辑:似乎我的方法不适用于 RPC,因为休眠会更改对象。(见thanos的回答)。谷歌有一种更新的方法将对象传输到前端:请求工厂。它看起来真的很好,我现在就试试这个。

Edit2:请求工厂完美运行,比 RPC 方便得多!

4

4 回答 4

2

当我创建我的 RPC 到 Hibernate 时,我使用这个例子作为一个框架。我建议下载他们的源代码并阅读名为“集成策略”的部分,因为我觉得“基本”部分并不能证明 DTO 的合理性。本教程没有介绍的一件事是来自网页的接收和发送部分(转换为 JS),这就是为什么我建议您下载他们的源代码并查看他们如何发送/接收每个 DTO。

发布堆栈跟踪和一些您认为对解决此错误有用的代码。

谷歌的 GWT 和休眠

阅读本文(和源代码)可能需要一些时间,但确实有助于理解它们的逻辑。

于 2013-05-25T14:05:59.867 回答
2

这是来自 GWT 文档的引用。它说休眠将对象从原始形式更改为使其持久化。

这对 GWT RPC 意味着,当对象准备好通过网络传输时,它实际上并不是编译器认为将要传输的对象,因此在尝试反序列化时,GWT RPC 机制不再知道类型是什么并拒绝反序列化它。

不幸的是,实现该解决方案的唯一方法是制作 DTO 及其适当的转换器。

使用Gilead是一种更清洁的方法(不需要所有这些 DTO 代码),但 DTO 更轻量级,因此通过线路产生的流量更少。

无论如何,还有Dozer,它将为您生成 DTO,因此您不需要太多实际编写代码。

无论哪种方式,正如 mchq08 所说,他提供的链接将解决许多问题。

我还要提出另一个建议!将项目分开。为您的应用程序创建一个新的模型并将 jar 包含到 GWT 中。通过这种方式,您的 GWT 项目将几乎完全是 GUI 和 jar 库,也可以重新用于其他项目。

于 2013-05-25T23:38:47.070 回答
0

我使用了下一个方法:对于每个休眠实体类,我都有没有任何休眠内容的客户端副本。我也有在客户端 <-> 服务器类之间复制数据的机制。这是可行的,但我相信当前的 GWT 版本应该与休眠注释类一起使用。

于 2013-05-25T13:25:54.060 回答
0

在一个客户端项目中,我使用Moo(我编写的)相对轻松地将 Hibernate 增强的域对象转换为 DTO。

于 2013-05-28T01:08:07.180 回答