我在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
?
答案 0 :(得分:2)
@DynamicUpdate无法解决您的问题。此注释仅用于性能优化。
如果您只想更新实体的某些属性,可以采用以下方法:
编写本机sql查询以更新这些列(字段)。 (不推荐,因为最好尽可能在实体中重复使用映射。)
首先从数据库中获取实体,然后更新您想要的字段并保存。 一般不推荐,因为在这种情况下不必要的代码。为什么我们必须在没有必要时手动获取实体。但如果有不同的api更新只有一个字段说update1 api更新field1,update2 api更新field2,update3更新field3,.... updateN api更新fieldN,这种方法会比下一个更好(在维护代码方面)一个作为下一个需要几个不同的更新查询。但是这种需求非常罕见,不会推荐这种解决方案。
使用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
*/
}