Java 春季MVC@SessionAttributes混乱!

Java 春季MVC@SessionAttributes混乱!,java,spring-mvc,session,Java,Spring Mvc,Session,我使用的是2.5,所有的事情都是通过注释完成的 我有一个简单的表单,允许用户编辑对象。它后面的控制器创建对象,并在GET时将其添加到模型中,并在POST(提交)时处理更改。它很好用,但我不明白为什么。对象从未显式地添加到会话中,并且对象的“id”不会传递给submit方法。控制器的submit方法如何知道对象的“id”值 出现这个问题的原因是我有另一个表单/控制器,它与上面的表单/控制器几乎相同,但除非我将对象添加到@SessionAttributes,否则它不会“工作”。不同之处在于,这个特定

我使用的是2.5,所有的事情都是通过注释完成的

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

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

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

到底发生了什么事?我需要帮助

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


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

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

你应该小心会话属性,我总是尽量避免它,除非我有很好的理由。与冬眠相结合,它会引起各种各样的头痛

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