我正在使用2.5并通过注释完成所有操作。
我有一个简单的表单,允许用户编辑对象。它后面的控制器创建对象并将其添加到GET上的模型,并在POST(提交)上处理更改。它工作正常,但我不明白为什么。该对象永远不会显式添加到会话中,并且对象的“id”不会传递给submit方法。控制器的submit方法如何知道对象的“id”值?
这个问题出现的原因是我有另一个表单/控制器几乎与上面的相同,但除非我将对象添加到@SessionAttributes,否则它不会“工作”。区别在于此特定控制器使用的对象具有对延迟加载的另一个对象的引用(我在后台使用Hibernate)。当我在没有将父对象放在SessionAttributes中的情况下提交表单时,我得到一个DataIntegrityViolationException,因为我从不加载引用的对象。
当我将父对象添加到@SessionAttributes时,问题神奇地消失了。我神奇地说,因为即使我把父对象放在GET上的会话中,我仍然没有显式加载引用的对象,所以它应该是null(或者是一个空的代理或任何发生的事情)。
世界上发生了什么?我需要一些帮助!
答案 0 :(得分:2)
该对象很可能在提交阶段重新创建。 id可能会“存储”在隐藏的表单字段中。
你应该小心会话属性,我总是试图避免它,除非我有一个很好的理由。与Hibernate结合使用会产生各种各样的麻烦。
如果必须,请使用完全初始化的副本。
答案 1 :(得分:1)
控制器的submit方法如何知道对象的“id”值?
控制器不知道“id”。我认为Spring使用默认构造函数创建新对象,并将表单数据填充到其中。 Hibernate必须认为这是一个新对象,并使用新的id将其存储到数据库中。