Struts2 / Hibernate更新了几列而没有其他列数据

时间:2014-08-17 02:34:53

标签: java hibernate jsp struts2

我有一个包含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对象,并且我的action类可以访问此新对象以更新DB。问题是这个NEW对象只有屏幕上填写的2个字段。未显示的其他属性丢失。当尝试使用Hibernate更新对象时,它返回一个不可为空的异常value为NULL。

我查看了dynamic-update = true,其中说:

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

这听起来更好(为什么有人想要更新没有改变的列?)但是仍然无法工作,因为struts2创建了一个NEW对象,它没有剩下的属性。

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

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

1 个答案:

答案 0 :(得分:0)

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

编辑现有对象需要至少两个请求:一个用于检索对象并在表单上显示,另一个用于提交表单和更新对象。

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

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