2009-05-06 102 views
3

我使用2.5并通过注释做所有事情。Spring MVC @SessionAttributes混淆!

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

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

当我将父对象添加到@SessionAttributes时,问题奇迹般地消失。我神奇地说,因为即使我将父对象放入GET的会话中,我仍然没有显式加载引用的对象,所以它应该为空(或空代理或任何发生的事情)。

世界正在发生什么?我需要一些帮助!

回答

1

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

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

2

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

你应该小心会话属性,我总是试图避免它,除非我有一个很好的理由。与Hibernate相结合,它可以制造各种头痛。

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