3

我正在使用 2.5 并通过注释做所有事情。

我有一个简单的表单,允许用户编辑对象。它背后的控制器创建对象并在 GET 上将其添加到模型中,并在 POST(提交)上处理更改。它工作正常,但我不明白为什么。对象永远不会显式添加到会话中,并且对象的“id”不会传递给提交方法。控制器的提交方法如何知道对象的“id”值?

出现这个问题的原因是我有另一个表单/控制器,它与上面的几乎相同,但除非我将对象添加到@SessionAttributes,否则它不会“工作”。不同之处在于这个特定控制器使用的对象引用了另一个延迟加载的对象(我在幕后使用 Hibernate)。当我提交表单而不将父对象放入 SessionAttributes 时,我会收到 DataIntegrityViolationException,因为我从不加载引用的对象。

当我将父对象添加到 @SessionAttributes 时,问题神奇地消失了。我说的很神奇,因为即使我在 GET 上将父对象放入会话中,我仍然从未显式加载引用的对象,因此它应该为 null(或空代理或发生任何情况)。

世界上到底发生了什么?我需要一些帮助!

4

2 回答 2

2

该对象很可能在提交阶段重新创建。id 可能“存储”在隐藏的表单字段中。

你应该小心会话属性,除非我有很好的理由,否则我总是尽量避免它。与 Hibernate 结合使用会让人头疼。

如果必须,请使用完全初始化的副本。

于 2010-03-08T12:24:17.363 回答
1

控制器的提交方法如何知道对象的“id”值?

控制器不知道“id”。我认为 Spring 使用默认构造函数创建新对象并将表单数据填充到其中。Hibernate 必须认为这是一个新对象,并以新的 id 将其存储到数据库中。

于 2010-03-06T08:49:27.813 回答