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

Java 如何在Hibernate中更新实体的某些字段?,java,spring,hibernate,jackson,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 */ } @Inject SessionFactory sf; @Requ

我在web应用程序中使用Spring和Hibernate。我拥有如下实体:

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

   protected String prop1;

   protected String prop2;

   /*
    *  Getters And Setters
    */

}
@Inject
SessionFactory sf;

@RequestMapping("update")
@Transactional
public void update(@RequestBody MyClass myClass){
    sf.getCurrentSession.update(myClass);
}
{
   "prop1": "my value1",
   "prop2": "my value2"
}
当我想更新此实体的实例时,我使用jackson从客户端获取实例,如下所示:

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

   protected String prop1;

   protected String prop2;

   /*
    *  Getters And Setters
    */

}
@Inject
SessionFactory sf;

@RequestMapping("update")
@Transactional
public void update(@RequestBody MyClass myClass){
    sf.getCurrentSession.update(myClass);
}
{
   "prop1": "my value1",
   "prop2": "my value2"
}
用户数据如下:

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

   protected String prop1;

   protected String prop2;

   /*
    *  Getters And Setters
    */

}
@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


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

您可以在pojo类上使用@DynamicUpdate注释。这仅更新所需字段

样本:

@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
    */

}    

可以在pojo类上使用@DynamicUpdate注释。这仅更新所需字段

样本:

@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
    */

}    

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

如果只想更新实体的某些属性,以下是一些方法:

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

  • 首先从数据库中获取实体,然后更新要保存的字段一般不建议使用,因为在这种情况下不需要代码。为什么我们必须在这里不需要的情况下手动获取实体。但是如果有不同的api只更新一个字段,比如update1API更新字段1,update2API更新字段2,update3更新字段3,。。。。updateN api更新fieldN,这种方法(在维护代码方面)比下一种方法更好,因为下一种方法需要几个不同的更新查询。但这种需求非常罕见,因此不会推荐这种解决方案

  • 使用HQL。类似于“更新MyClass mc set mc.prop1=:prop1parameter,其中mc.id=:idparameter”,并适当地设置参数。(推荐


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

    如果只想更新实体的某些属性,以下是一些方法:

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

  • 首先从数据库中获取实体,然后更新要保存的字段一般不建议使用,因为在这种情况下不需要代码。为什么我们必须在这里不需要的情况下手动获取实体。但是如果有不同的api只更新一个字段,比如update1API更新字段1,update2API更新字段2,update3更新字段3,。。。。updateN api更新fieldN,这种方法(在维护代码方面)比下一种方法更好,因为下一种方法需要几个不同的更新查询。但这种需求非常罕见,因此不会推荐这种解决方案

  • 使用HQL。类似于“更新MyClass mc set mc.prop1=:prop1parameter,其中mc.id=:idparameter”,并适当地设置参数。(推荐


  • 必填字段?哪些字段是必需的?我的意思是,只有您正在更新的相应字段您现在面临的问题或情况是什么。我只设置了
    prop1
    ,在更新操作中它不包含
    prop2
    值。首先,您需要在将请求发送到服务器时保留请求正文中的所有值。如果缺少任何字段,将被视为更改,并将被视为UpdateRequired字段?哪些字段是必需的?我的意思是,只有您正在更新的相应字段您现在面临的问题或情况是什么。我只设置了
    prop1
    ,在更新操作中它不包含
    prop2
    值。首先,您需要在将请求发送到服务器时保留请求正文中的所有值。如果缺少任何字段,将被视为更改并考虑进行更新如果您希望控制要触发的确切更新查询(即,查询中应包含哪些字段),请使用HQL update语句。使用session.save/update/merge/saveOrUpdate hibernate在内部创建查询,您可能不需要细粒度的控制。您应该使用spring数据JPA。有一些非常好的例子可以让您轻松地完成所有CRUD操作。如果您想控制要触发的确切更新查询(即,查询中应包含哪些字段),请使用HQL update语句。使用session.save/update/merge/saveOrUpdate hibernate在内部创建查询,您可能不需要细粒度的控制。您应该使用spring数据JPA。有一些非常好的例子可以让您轻松完成所有CRUD操作。第三个建议中可能重复的是,
    MyClass
    必须有getter/setter方法。HQL是否使用getter/setter方法进行更新?在第三个建议中,
    MyClass
    必须使用getter/setter方法。HQL是否使用getter/setter方法进行更新?