我有一个包含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忽略空字段并只更新对象中具有值的字段吗?
答案 0 :(得分:0)
Hibernate正在管理您的对象,您只需要在具有占用多个http请求的生命周期的范围内的对象的id
保存,然后使用id
来从Hibernate会话中获取对象。
编辑现有对象需要至少两个请求:一个用于检索对象并在表单上显示,另一个用于提交表单和更新对象。
因为对象是具有默认范围的操作bean的成员,所以如果您具有对象的引用,则始终必须初始化对象的属性。您当然可以将操作bean的范围更改为会话,或者更好,使用范围拦截器将对象的范围用于会话,或者使用此问题中的注入Dependency Injection in Struts2 Accessing Session Scoped Beans(您可以使用任何DI框架)用Struts2配置的)。
你可以从作用域中获取这个对象,我的意思是对象的id
,通过这个id
从Hibernate会话中获取持久对象,修改它的属性并传回Hibernate进行更新。