GWT - 修改现有对象或创建新对象

时间:2013-02-03 11:20:42

标签: hibernate gwt serialization reflection immutability

我正在开发一个GWT + Hibernate项目。它涉及公司实体(因此也是一个表)。

用户界面有一个列出所有公司的视图。用户可以通过该视图编辑现有公司。

我的问题是 - 如何合并修改后的数据?我应该修改现有的,检索到的公司实体对象,还是应该创建一个包含新数据的新实例?

前者将保存新实例的创建,并可能复制未修改的数据。但是,这意味着为公司的每个领域展示制定者。这不利于减少可变性。

后一个选项会创建一个新实例,并可能涉及复制未修改的数据。但是,它将使我免于暴露制定者,从而鼓励不变性。

推荐哪一个?

此外,延迟绑定/反射或序列化是否要求所有的getter / setter都存在?在这种情况下,我的问题变得没有实际意义,因为无论如何我都必须提供它们。

编辑 - 我正在使用GWT-RPC与服务器进行通信。

1 个答案:

答案 0 :(得分:1)

GWT-RPC不强制要求getter和setter。它会使用它们存在,但会直接注入字段。然而,它无法处理final fields(您可以通过将您的字段保留为非最终字段并仅显示获取者或执行your own GWT-RPC serialization for the class来缓解此问题。)

现在,正如你所说的那些对象是你的JPA / Hibernate实体,我相信JPA想要可变对象,这样就可以回答这个问题了。

另一个需要关注的是如何将实体绑定到UI。例如Editor framework也要求可变对象。

您可能还希望以不会变异或创建新的方式向服客户端上的对象(您仍然需要在服务器端解决问题,但它不在GWT的范围之外)。

根据上述情况,我会说你应该对你的对象的可变性,因为你正在使用的API(JPA / Hibernate,GWT-RPC)或者可能想要考虑(编辑)所有的任务或最好用可变对象。

请注意,RequestFactory在客户端使用冻结对象:对于给定的时间范围,它们在给定的上下文中只是可变的。在服务器端,可变性是必须的(但您可以考虑冻结对象,或使用构建器模式)