Java Struts2/Hibernate只更新少数列,而不更新其他列数据
我有一个包含3个字段的对象,但屏幕上只显示其中的2个字段供用户更新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
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.