使用GET将数据对象从客户端传输到服务器以保持数据的方式是什么?

时间:2011-08-19 12:18:18

标签: java hibernate gwt jpa

如果您使用JPA或其他类型的持久性,您可能有办法保存通过ajax发送到客户端的记录。

编辑:界面是用GWT完成的,所以所有的ajax调用都是经典的java方法(转换为等价的javascript)

让我们把类Person作为数据库中的实体。 人有四个字段:name, birthday, id, email

当您通过ajax从服务器加载某人时,通常会向客户端发送一个Person对象。

在人物编辑器中,显示姓名,生日和电子邮件。编辑Person对象时,您可能希望显示id。

有两种情况:

  • 保存人:只能更改电子邮件,但您可以显示ID
  • 创建人:可以更改电子邮件,姓名和生日

当您将刚刚编辑的数据发送到服务器时,您的进展方式是什么?

我看到了几种方法:

  • 发送一个Person对象。在这种情况下,您必须处理您持久存储的数据,而不仅仅是让您从客户端收到的人物对象持久化模式,因为黑客可以发送您可能不想更改的数据(并且您不能信任接口以禁用这些数据)变化)。在这种情况下,也有几种方法:
    • 使用两个函数(保存并创建),在服务器上创建一个新的Person对象(如果你在save方法中,则通过id加载持久化实例)并将你想要的所有字段从客户端Person对象复制到持久化一个
    • 使用一个函数(saveOrCreate)并检查id是否存在。它等同于上述方法,将两个函数合并为一个大的“if”
  • 将数据发送到服务器(电子邮件,生日,姓名,ID(编辑时))。执行此操作时,请创建一个新的Person对象(或加载持久的对象)并将数据复制到此持久化实例。

总结一下,您有以下方法签名之一(仅适用于编辑案例):

  • Person savePerson(Person person);
  • Person savePerson(String id, String email);

我看到每种方法的利弊。例如,第一个允许快速更改P​​erson模型而不修改所有savePerson调用。但是它比第二种方法更难以理解什么是真正保存的。

我不知道什么是最好的,如果你知道另一种方法。那么,你好吗?

1 个答案:

答案 0 :(得分:1)

使用域对象进行数据传输总是很好。在GWT中,您必须定义接口并标记Rpc BeanProxies。作为项目演变的一部分,您需要向对象添加其他字段。如果你选择使用数据属性而不是对象的接口,你将不断更改它们,方法签名变得笨拙和不可读。

但是,某些人要求将持久域实体与业务域分开。在这种情况下,可以使用属性复制(apache commons-bean utils)。