【问题标题】:Hibernate objects and GWT-RPCHibernate 对象和 GWT-RPC
【发布时间】:2013-05-20 22:32:18
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: java hibernate gwt rpc dto


    【解决方案1】:

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

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

    不幸的是,实施该解决方案的唯一方法是制作 DTO 及其相应的转换器。

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

    总之还有 Dozer,它会为你生成 DTO,这样你就不需要真正编写代码了。

    正如 mchq08 所说,他提供的链接将解决许多问题。

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

    【讨论】:

    • Gilead 曾经是一个很好的解决方案,但问题是 Gilead 不再受支持,如果你使用它,你就会被过时的 GWT 版本卡住。
    【解决方案2】:

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

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

    Google's GWT & Hibernate

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 你确定hibernate-annotated类应该在较新的GWT版本中工作吗?找不到任何相关信息。副本对象是一种解决方案,但它们也是大量样板代码。
      【解决方案4】:

      在一个客户项目中,我使用Moo(我写的)将 Hibernate 增强的域对象翻译成 DTO 相对轻松。

      【讨论】:

      • 谢谢,但我已经通过 gwt 请求工厂找到了完美的解决方案 :)
      猜你喜欢
      • 2011-03-18
      • 1970-01-01
      • 2012-01-17
      • 1970-01-01
      • 2017-10-31
      • 2014-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多