【发布时间】: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