如何使用Hibernate有选择地更新Spring bean的属性?

时间:2014-10-22 03:43:12

标签: java hibernate spring-mvc

给定一个域对象:

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 / Hibernate使用属性“a”和“b”的表单输入值更新myPojoObj,但在我的情况下,它还将属性“c”的值设置为null。

这是预期的行为吗?如果是这样,保留分配给属性“c”的任何值的最佳做法是什么?是否有注释或其他方式只更新属性“a”和“b”?

澄清: 理想情况下,我正在寻找允许在一个页面上更新“a”和“b”以及在另一个页面上更新“b”和“c”的内容,并为每个特定请求保留所有其他属性静态。

2 个答案:

答案 0 :(得分:0)

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

@DynamicUpdate

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

答案 1 :(得分:0)

您想在哪里存储实体的状态? Session,view或db?

添加

@SessionAttributes({&#34; myPojo&#34;})

致你的控制器

或者在视图中使用带有c值的隐藏输入字段

或使用@ModelAttribute注释控制器方法并从db返回每个请求的实体

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