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

在Spring Data JPA中结合getOne()和save()是否是通过确保实体存在来更新实体的最优方法?

钱劲
2023-03-14

我知道有几种方法,我们可以遵循更新一个现有的实体。下面我会提到两种方法,我需要澄清我对这两种方法的看法是否正确。最终的目标是通过确保主键在更新之前是有效的,找到我们可以遵循的更新实体的最优方法。所以请随意陈述任何其他机制。

方法一:

    null
try {

        CustomerCategory customerCategory = customerCategoryRepository.getOne(customerCategoryRequestDto.getCode());
         
        customerCategory.setStatus(customerCategoryRequestDto.getStatus());
     
        CustomerCategory savedCustomerCategory = customerCategoryRepository.save(customerCategory);
        CustomerCategoryResponseDto customerCategoryResponseDto = modelMapper.map(savedCustomerCategory, CustomerCategoryResponseDto.class);
        return customerCategoryResponseDto;

      } catch (EntityNotFoundException e) {
          throw new EntityNotFoundException(ExceptionMessage.MSG_ENTITY_NOT_FOUND);
      }

然后执行更新。在这里,我使用了一个查询来更新实体。但是,通过将必要的字段设置为从前面的find()方法调用中找到的实体,并通过调用save()方法,可以很容易地实现这一点。但是这里我看到的问题是我们需要一个额外的查询来确保给定的id是有效的。所以我认为这肯定会降低数据库的性能。但是在大多数网站和教程中,大多数作者都遵循这种机制。我没有看到任何实际的用例或需要我们需要这种机制而不是第一个机制。

 Optional<CustomerCategory> searchedCustomerCategory = customerCategoryRepository.findById(customerCategoryRequestDto.getCode());
        if (!searchedDbpCustomerCategory.isPresent()) {
            throw new EntityNotFoundException(ExceptionMessage.MSG_ENTITY_NOT_FOUND);
        }
        customerCategoryRepository.updateCustomerCategory(CustomerCategoryStatus.DELETED.toString(), customerCategoryRequestDto.getCode());

共有1个答案

姬寂离
2023-03-14

其实有案有案。

当您只需要引用时(例如维护关系),那么就使用jparepository#getOne(ID ID)

当您需要更新实体时,请使用crudrepository#findbyid(ID ID)

Entity ref = repo.getOne(1l);
ref.setAttribute("value");

与这样做只有一个区别:

Entity entity = repo.findById(1l);
entity.setAttribute("value");

不同的是,加载操作在getOne中是lazy而在findbyid中是eage

但当您需要从实体更新列时,性能没有任何提高。

此外,请注意,getOne不推荐使用getById,后者也是如此。

 类似资料:
  • 问题内容: 假设下面的字符串模板被赋予了Java Bean对象的列表: 即人员列表中可能包含您可能无法或无法增强/扩展的对象: 该和方法不返回消毒(编码的HTML实体)。您如何解决这个问题? 问题答案: 您可以使用自定义渲染器,例如: 然后在模板中指示您希望其转义: 也就是说,您可能更喜欢清理输入的数据,在发送到模板之前进行转换,将经过装饰的人发送到模板等。 输出:

  • 请让我知道在Spring data JPA中做这件事的简单方法。

  • 我正在尝试编写一个Updatestatus方法,该方法仅在我保存对数据库的更改时更新实体的状态字段。如果实体中的任何其他字段发生了变化,我不想将这些更改保存到数据库中。对于实体自己的字段来说,这很简单,使用: 但是,我发现,如果相关实体没有键值集,则将插入通过我设置状态的实体的导航属性可访问的任何相关实体。因此,如果将新的子实体添加到实体中。子项,并且子实体ChildId属性为0,则该子项将插入到

  • 我试图通过PartitionKey和RowKey从Azure表存储中检索一个实体。当我的表中确实有一个实体带有这些键时,这种方法非常有效。 但是,当没有找到带有for键的实体时,我只是收到一个相当不清楚的错误,说“其中一个请求输入无效”…… 未处理的拒绝存储错误:其中一个请求输入无效。 有没有办法检查特定分区和行密钥是否存在实体?

  • 问题内容: 有没有一种方法可以确定给定的示例实体类: 所谓“新”,是指有人调用了新的A()甚至可能设置了名称,但从未保存或保留。 通常,人们可以检查id,但是我想要一种不需要id或getId()方法的解决方案。 基本上,即使在分离模式下,此实体也已持久化到数据库中。 @Version或getVersion也不是令人满意的解决方案。 也许是独立的|| isAttached可能有效,但是我不确定如何在

  • 我有一个方法,它调用另一个方法来保存具有新事务的实体对象。 process()正在调用FooCreator类中的createFoo()方法,以使用@Transactional(传播=传播。需要\u NEW)创建foo对象。 在process方法中修改返回的foo对象时,它会另存为新对象。如何修改createFoo()返回的现有foo对象? 如果我尝试findById,它仍会引发异常。 如何在新事务