2013-05-25 52 views
2

我想用GWT-RPC将hibernate对象转移到前端。当然,我不能转移注释类,因为注释不能编译为javascript。所以我完全在“.hbm.xml”中完成了hibernate映射。这对于非常简单的对象来说很好。但是,只要我加入更复杂的东西,比如用一个例子来实现oneToMany关系。一个集合,编译器会抱怨集合的一些序列化问题(但集合中的对象也是可序列化的)。Hibernate对象和GWT-RPC

我猜这是行不通的,因为hibernate创建了一些GWT无法解释的特殊集合?

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

编辑:看来我的方法是不可能与RPC,因为休眠更改对象。 (请参阅thanos的回答)。 google有一个更新的方法来将对象传输到前端:请求工厂。它看起来非常好,我现在会尝试。

编辑2:请求工厂工作完美,比RPC更方便!

回答

2

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

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

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

使用Gilead是一个更清洁的方法(不需要所有这些DTO代码),但DTOs更多ligtweight,从而通过电线产生更少的流量。

无论如何也有推土机,这将为您生成的DTOs,所以没有太多的需要哟实际编写的代码。

无论哪种方式,mchq08表示他提供的链接将解决许多问题。

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

+0

Gilead是一个很好的解决方案,但问题在于Gilead不再受支持,如果使用它,则会陷入过时的GWT版本。 – ATrubka

0

我使用了下一个批准:对于每个hibernate实体类,我有没有任何休眠的东西的客户端副本。此外,我有机制在客户端< - >服务器分支之间复制数据。 这是工作,但我相信目前的GWT版本应与休眠注释类工作..

+0

你确定,hibernate-annotated类应该可以在新的GWT版本中工作吗?找不到任何关于这方面的信息。副本对象是一种解决方案,但它们也是很多样板代码。 – jan

2

当我创建我的RPC到Hibernate我用这个例子作为框架。我建议下载它们的源代码并阅读“集成策略”一节,因为我觉得“基本”部分没有证明DTO是正确的。本教程没有做的一件事就是从网页的接收和发送部分(它转换为JS),这就是为什么我建议你下载他们的源代码并查看他们如何发送/接收每个DTO。

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

Google's GWT & Hibernate

读这(和源代码)可能需要一些时间,但确实有助于了解他们的逻辑。

0

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

+0

谢谢,但我已经找到gwt请求工厂的完美解决方案:) – jan