当前位置: 首页 > 知识库问答 >
问题:

Spring Boot JPA CrudRepository选择性更新-仅部分属性

东方俊力
2023-03-14

在使用带有Spring Boot JPA的Hibernate时,我注意到,当试图在扩展Spring的CrudRepository接口的存储库工件中实现更新方法时,必须将要更新的整个实体对象传递给这样的更新方法。只是直觉上,这似乎很浪费,我想知道什么是获得Spring Data/JPA的干净方法,即假设只有那些传入的值需要更新,而不对那些未传入的值进行修改。

这是当前的服务方法,

   public void updateCustomer(Long id, Customer customer) throws Exception {
        customerRepository.save(customer);
    }

共有1个答案

狄宇
2023-03-14

在JPA中,您传递实体,框架就会发现您更改了哪些属性。如果您还不知道这一点,我建议您花更多的时间阅读JPA的基本知识。从表面上看,JPA看起来简单易懂,但是如果您不了解它所建立的原理,那么您最终将花费大量时间调试和搜索以破译错误消息。

当一个实体被托管时,JPA将在加载对象时获取该对象的副本,然后将其与传递给save/persist的版本进行比较,并确定应该更新哪些列。这就形成了一个易于使用的开发人员模型,在这个模型中,您(通常)不必考虑实体的更改。

您可能会认为,正如Rob所建议的那样,加载一个实体来更改一个属性是浪费的,但情况并不总是这样。默认情况下,EclipseLink和Hibernate都使用共享(第二级)缓存,因此如果实体已经加载,它可能从内存而不是从DB加载,并且一旦您修改了该实体,JPA将比较内存中的两个对象,并生成修改列所需的SQL。

有些时候,您需要优化您的JPA代码(但只有在您已经测量了哪些操作是慢的情况下)。典型的场景是批量删除/更新,您不希望JPA花费时间读取/复制/管理正在删除/更新的实体。在这些情况下,您可以使用delete或update查询,而不是加载实体并调用EntityManager.Remove()或在事务中修改实体。但是,您应该注意,这绕过了EntityListeners和cascade指令,因为这些指令只针对托管实体调用。

 类似资料:
  • 问题内容: 我收到一个包含30个字段的JSON,而我的实体是根据此JSON构建的。问题是:不应更新两个字段(两个日期)。 如果使用,两个字段都会更新。 如何避免更新这两个字段? 也许使用criteria.Example? 没有我写大量的HQL,有什么方法可以做到这一点吗? 问题答案: 本文非常详细地解释了您的问题,但我也将在这里进行总结。 如果您永远不想更新这两个字段,则可以将它们标记为: 当你将

  • 只有当新项目的日期比现有项目更近时,我才想更新DynamoDB中的项目。目前,我正在查询现有项目,在代码中进行比较,然后写入数据库。我想知道是否有办法让DynamoDB为我进行检查。我已经研究过使用预期,但是它的比较运算符需要引入一个参数,这违背了目的,因为这意味着无论如何都必须查询现有项目。 我和8Java一起工作。

  • 在HTML中,可以通过元素各种各样的属性,来给元素增加很多附加信息。如通过 width 属性,可以指定元素的宽度;通过 id 属性,可以区分不同的元素,并通过Javascript来控制这些元素的内容和状态。 以往的CSS中,大量使用类选择器来定义样式。由于类选择器并不能说明什么样式服务于什么元素。因此,对于一个大型网站,CSS代码比较庞大,若要修改某个样式,就成为非常头疼的事情。 CSS的属性选择

  • 具有特定属性的HTML元素样式 具有特定属性的HTML元素样式不仅仅是class和id。 注意:IE7和IE8需声明!DOCTYPE才支持属性选择器!IE6和更低的版本不支持属性选择器。 属性选择器 下面的例子是把包含标题(title)的所有元素变为蓝色:[title] { color:blue; } 属性和值选择器 下面的实例改变了标题title='runoob'元素的边框样式:[title=r

  • 问题内容: 我有下表,其中包含两个字段,即a和b,如下所示: 插入一些记录: 注意 :现在我要向员工显示唯一且仅属于部门和部门的员工。因此,根据条件,只应显示雇员,因为他仅属于部门和部门。但是员工不应因为属于而出现。 预期结果 : 如果条件为:,则结果应为: 如果条件为:,则结果应为: 如果条件是:,并且随后的结果应该是: 注意 :我只想在子句中执行此操作(不想使用and子句),因为我还将在另一个

  • 问题内容: 在“旧的JDBC美好时光”中,我编写了许多SQL代码,这些代码仅针对实际上已更改的“属性/成员”进行了针对性的更新: 例如,考虑具有以下成员的对象: 如果仅在某些业务方法中进行了更改,我将只为该成员发出一个SQL 。 但是,似乎(这是我对Hibernate的“印象”)在使用标准Hibernate映射(映射完整类)时,即使仅单个成员的更新也会导致Hibernate生成的SQL语句中对象的