【问题标题】:Spring MVC @SessionAttributes confusion!Spring MVC @SessionAttributes 混乱!
【发布时间】:2009-05-06 14:56:15
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: java spring-mvc session


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-28
        • 1970-01-01
        • 1970-01-01
        • 2015-10-20
        • 2014-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多