1

我有一个名为“Parent”的简单 pojo,其中包含对象“Child”的集合。

在hibernate/jpa中,它只是一个一对多的关联,孩子不知道他们的父母:这些孩子对象可以有不同类型的父母,所以更容易不知道父母(想想代表标签的孩子,父母可以是具有标签的不同对象类型)。

现在,我将我的 Parent 对象发送到我网站的客户端视图以允许用户对其进行修改。

为此,我使用 Hibernate/GWT/Gilead。

我的用户进行了一些更改,然后单击将我的 Parent 对象发送到服务器的保存按钮 (ajax)。我父母的字段已被修改,但更重要的是,集合中已添加或删除了一些子对象。

总而言之,当父对象返回服务器时,它现在在其集合中具有: - id 为空且需要持久化的新“子”对象 - id 不为空且需要合并的已修改“子”对象 -可能被黑客入侵的“子”对象,其中 id 不为空但不属于父级 - 缺少(删除)子对象:需要删除

你如何保存父对象(及其集合)?您是否从数据库加载父集合以比较修改后集合的每个对象以查看是否没有被黑客入侵的项目?您是否清除旧集合(以删除孤儿)并重新添加新孩子(但有一些尚未修改的孩子)?

谢谢

PS:对不起我的英语,我希望你理解这个概念;)

4

2 回答 2

1

您的堆栈中的某些东西必须提供您正在谈论的逻辑,并且考虑到您的情况,它可能是您。您必须通过从数据源中读取来获取对象的当前持久状态,以便进行比较。请记住,如果多个合法操作可以同时更新您的父对象及其集合,您将必须非常小心地定义您的事务粒度和代码的线程安全性质。

无论如何,这都不是一个简单的问题,并且很可能有框架功能可以提供帮助,但是对于我遇到的任何现实世界的实现,我还没有找到解决这个问题的方法,尤其是在我有逻辑试图区分合法和“被黑”的数据。

您可以考虑更改您的体系结构,以便将父级和子级保持在单独的操作中。这可能不适合您的情况,但您可以通过拆分持久性操作并提供面向儿童的安全性来获得更精细的事务,从而使您的黑客问题更易于管理。

祝你好运。我建议您在进行过多编码之前绘制详细的逻辑流程图。

于 2010-01-29T10:13:19.493 回答
0

我发现的最佳解决方案是管理手动创建的 DTO。DTO 只向客户端发送需要的数据。对于我想在 ReadOnly 模式下设置的每个字段,我会根据我使用 dto 发送给客户端的密钥来计算签名。

当我的 DTO 返回服务器时,我检查签名以确保我的只读字段没有更改(使用返回字段重新计算签名并将其与使用 dto 返回的签名进行比较)

它允许我指定只读字段并确保我的对象没有被黑客入侵。

于 2010-02-16T17:12:56.360 回答