如何在Hibernate中更新实体的某些字段?

时间:2015-12-24 08:35:03

标签: java spring hibernate jackson

我在Web应用程序中使用Spring和Hibernate。我有一个实体如下:

@Entity
public class MyClass{
   @Id
   @GeneratedValue
   protected Long id;

   protected String prop1;

   protected String prop2;

   /*
    *  Getters And Setters
    */

}

当我想更新这个实体的实例时,我使用jackson从客户端获取实例,如下所示:

@Inject
SessionFactory sf;

@RequestMapping("update")
@Transactional
public void update(@RequestBody MyClass myClass){
    sf.getCurrentSession.update(myClass);
}

用户数据如下:

{
   "prop1": "my value1",
   "prop2": "my value2"
}

这项工作正确。我的问题是当我只想更新prop1时。在这种状态下,我也必须设置prop2。如果我不这样做,则会将prop2更新为null

如何在不将prop从客户端发送到服务器的情况下更新prop2

2 个答案:

答案 0 :(得分:2)

@DynamicUpdate无法解决您的问题。此注释仅用于性能优化。

如果您只想更新实体的某些属性,可以采用以下方法:

  1. 编写本机sql查询以更新这些列(字段)。 (不推荐,因为最好尽可能在实体中重复使用映射。)

  2. 首先从数据库中获取实体,然后更新您想要的字段并保存。 一般不推荐,因为在这种情况下不必要的代码。为什么我们必须在没有必要时手动获取实体。但如果有不同的api更新只有一个字段说update1 api更新field1,update2 api更新field2,update3更新field3,.... updateN api更新fieldN,这种方法会比下一个更好(在维护代码方面)一个作为下一个需要几个不同的更新查询。但是这种需求非常罕见,不会推荐这种解决方案。

  3. 使用HQL。类似于“更新MyClass mc set mc.prop1 =:prop1parameter where mc.id =:idparameter”并正确设置参数。 (的推荐

答案 1 :(得分:-2)

您可以使用@DynamicUpdate注释在pojo类中执行此操作。这只会更新必填字段

样品:

@Entity
@DynamicUpdate//Add this annotation for updating selected fields
public class MyClass{
   @Id
   @GeneratedValue
   protected Long id;
   protected String prop1;

   protected String prop2;

   /*
    *  Getters And Setters
    */

}