Spring MVC @SessionAttributes 混淆!

3
我正在使用2.5版本,并通过注释完成所有操作。
我有一个简单的表单,允许用户编辑对象。该表单后面的控制器会在GET请求时创建对象并将其添加到模型中,在POST(提交)时处理更改。它工作得很好,但我不明白为什么。对象从未被显式地添加到会话中,对象的"id"值也没有传递给submit方法。控制器的submit方法是如何知道对象的"id"值的?
出现这个问题的原因是我有另一个表单/控制器,几乎与上面的表单相同,但如果我不将对象添加到@SessionAttributes中,它就无法正常工作。区别在于这个特定控制器所使用的对象具有对另一个对象的引用,而该对象是延迟加载的 (我在幕后使用Hibernate)。当我在没有将父对象放入SessionAttributes的情况下提交表单时,我会收到DataIntegrityViolationException异常,因为我从未加载引用对象。
当我将父对象添加到@SessionAttributes中时,这个问题神奇地消失了。我之所以说神奇,是因为即使我在GET请求时将父对象放入会话中,我仍然从未显式地加载引用对象,因此应该为null (或空代理或发生其他情况)。
这到底是怎么回事?我需要帮忙!
2个回答

2

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

你应该小心使用会话属性,除非有非常好的理由,否则我总是尽量避免使用它。与Hibernate结合使用时,可能会产生各种问题。

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


1
控制器的submit方法如何获取对象的“id”值?
控制器并不知道“id”。我认为Spring使用默认构造函数创建新对象并将表单数据填充到其中。Hibernate会认为这是一个新对象,并将其存储到数据库中,生成一个新的id。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接