Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Struts2/Hibernate只更新少数列,而不更新其他列数据_Java_Hibernate_Jsp_Struts2 - Fatal编程技术网

Java Struts2/Hibernate只更新少数列,而不更新其他列数据

Java Struts2/Hibernate只更新少数列,而不更新其他列数据,java,hibernate,jsp,struts2,Java,Hibernate,Jsp,Struts2,我有一个包含3个字段的对象,但屏幕上只显示其中的2个字段供用户更新 class Person { Integer id; String lastName; String firstName; Date birthDate; . . . getters/setters } My action对象包含具有getter和setter的Person对象: class myAction { Person person; public

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

class Person {
    Integer id;
    String lastName;
    String firstName;
    Date   birthDate;
    . . . 
    getters/setters
}
My action对象包含具有getter和setter的Person对象:

class myAction {
    Person person;

    public void setPerson(Person person) {
        this.person = person;
    }
    public Person getPerson() {
        return this.person;
    }
}
我的JSP使用struts2将两个字段链接到这个对象,如下所示:

<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>
这听起来更好(为什么会有人想更新没有更改的列?),但仍然不起作用,因为struts2创建了一个新对象,它没有其他属性

在我的action类中,我不必(再次)选择对象,根据struts2填充的内容设置新值,然后更新对象。我也不必编写特殊的HQL update语句来只更新屏幕上存在的列


那我怎么才能避开这件事呢?是否有办法保留原始对象(从进入屏幕的操作中)当查询完成时,用户更改时更新,并再次“发送”该确切对象到提交操作,以便该对象保留屏幕上未显示的其他数据?或者我可以告诉Hibernate忽略空字段,只更新对象中有值的字段吗?

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

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

因为您的对象是具有默认作用域的ActionBean的成员,所以如果您有对该对象的引用,则始终必须初始化对象的属性。当然,您可以将ActionBean的作用域更改为会话,或者更好地使用作用域拦截器将对象的作用域更改为会话,或者像本问题一样使用注入(您可以使用任何配置了Struts2的DI框架)

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

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