0

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

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

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

前者将保存新实例的创建以及未修改数据的可能复制。但是,这意味着公开公司各个领域的二传手。这不利于降低可变性。

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

推荐哪一个?

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

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

4

1 回答 1

1

GWT-RPC 不强制要求 getter 和 setter。如果它们存在,它将使用它们,但否则将直接注入字段。然而,它无法处理final字段(您可以通过让您的字段保持非最终状态并仅公开 getter 或为 class 进行自己的 GWT-RPC 序列化来缓解这种情况)。

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

要查看的另一件事是如何将实体绑定到 UI。例如,编辑器框架也要求可变对象。

您可能还希望将与实体不同的对象(例如,类似于操作转换的命令对象)发送回服务器,这样您就不必在客户端改变或创建新对象(您会仍然必须解决服务器端的问题,但它超出了 GWT 的范围)。

鉴于上述情况,我会说您应该考虑对象的可变性,因为您正在使用的 API(JPA/Hibernate、GWT-RPC)或可能想要考虑(编辑器)所有授权或最好使用可变对象。

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

于 2013-02-03T17:04:52.200 回答