【问题标题】:Struts2/Hibernate update few columns without having other column dataStruts2/Hibernate 在没有其他列数据的情况下更新少数列
【发布时间】:2014-08-17 02:34:53
【问题描述】:

我有一个包含 3 个字段的对象,但屏幕上只显示了 2 个字段供用户更新。

class Person {
    Integer id;
    String lastName;
    String firstName;
    Date   birthDate;
    . . . 
    getters/setters
}

我的操作对象包含带有 getter 和 setter 的 Person 对象:

class myAction {
    Person person;

    public void setPerson(Person person) {
        this.person = person;
    }
    public Person getPerson() {
        return this.person;
    }
}

我的 JSP 使用 struts2 将 2 个字段链接到这个对象:

<p/>Enter your first name <s:textfield name="person.lastName"/>
<p/>Enter your Last name  <s:textfield name="person.firstName"/>
<button id="btnSave">Save changes</button>

因此,当单击按钮时,struts 会填充一个新的 Person 对象,并且我的操作类可以访问这个新对象来更新数据库。问题是这个 NEW 对象只填充了屏幕上的 2 个字段。其他未显示的属性都丢失了,当尝试使用 Hibernate 更新对象时,它返回一个不可为空值的异常无效的。

我查看了 dynamic-update=true 它说:

specifies that UPDATE SQL should be generated at runtime and can contain only 
those columns whose values have changed. 

这听起来更好(为什么有人要更新没有更改的列???)但仍然不起作用,因为 struts2 创建了一个新对象,它没有其余属性。

在我的动作类中,我不应该(再次)选择对象,从 struts2 填充的内容中设置新值,然后更新对象。我也不应该编写特殊的 HQL 更新语句来仅更新屏幕上存在的列。

那么我该如何解决这个问题?有没有办法在查询完成时保留原始对象(从进入屏幕的操作),更新是用户更改并再次“发送”该确切对象到提交操作,以便该对象保留其他数据没有显示在屏幕上?或者我可以告诉 Hibernate 忽略空字段并只更新对象中具有值的字段吗?

【问题讨论】:

    标签: java hibernate jsp struts2


    【解决方案1】:

    Hibernate 正在管理您的对象,您只需将对象的 id 保存在具有占用多个 http 请求的生命周期的范围内的某个位置,然后使用该 id 从中获取对象休眠会话。

    至少需要两个请求来编辑已存在的对象:一个是检索对象并显示在表单上,​​另一个是提交表单并更新对象。

    因为您的对象是具有默认范围的操作 bean 的成员,所以如果您有对该对象的引用,则始终必须初始化对象的属性。您当然可以将操作 bean 的范围更改为会话,或者更好的是,使用范围拦截器将对象的范围用于会话,或者使用像这个问题 Dependency Injection in Struts2 Accessing Session Scoped Beans 中的注入(您可以使用任何 DI 框架用 Struts2 配置)。

    你可以从作用域中获取这个对象,我的意思是对象的id,通过这个id从Hibernate会话中获取持久对象,修改它的属性并传回Hibernate进行更新。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多