如何使用Hibernate选择性地更新Springbean的属性



给定一个域对象,如:

class MyPojo
  get/setA
  get/setB
  get/setC

如果我使用MyPojo作为表单的modelAttribute,那么它有类似于:

 <form:form modelAttribute="myPojo" action="nextPage" method="POST">
    <form:input path="a"/>
    <form:input path="b"/>
 </form> 

我有一个控制器方法,比如:

@RequestMapping(value = {"/nextPage"}, method = RequestMethod.POST)
public String theNextPageMethod(@ModelAttribute("myPojo") MyPojo myPojoObj) {
         //call to a service/dao impl are omitted for brevity
         //but the dao impl does:
        sessionFactory.getCurrentSession().saveOrUpdate(myPojoObj);
}

Spring/HHibernate使用属性"a"one_answers"b"的表单输入值更新myPojoObj,但在我的情况下,它还将属性"c"的值设置为null。

这是预期的行为吗?如果是这样的话,保存分配给财产"c"的任何值的最佳做法是什么?是否存在仅更新属性"a"one_answers"b"的注释或其他方式?

澄清:理想情况下,我正在寻找一些东西,允许更新一个页面上的"a"one_answers"b",更新另一个页面的"b"one_answers"c",并为每个特定请求保持所有其他属性的静态。

您想将实体的状态存储在哪里?会话、视图还是数据库?

添加

@会话属性({"myPojo"})

到您的控制器

或者在您的视图中使用一个隐藏的输入字段,其中包含c的值

或者用@ModelAttribute注释控制器方法,并在每次请求时从数据库返回实体

您还可以为表单创建一个新的、更小的POJO,并使用Dozer将值复制到真实实体中/从真实实体中复制值,并使用动态更新。

尝试动态更新属性,它应该可以解决您的问题。

@DynamicUpdate

现在,只有更改的列才会更新。另请参见示例http://www.mkyong.com/hibernate/hibernate-dynamic-update-attribute-example/

最新更新