【问题标题】:How can I implement a Save Or Update function using Spring Data Jpa?如何使用 Spring Data Jpa 实现保存或更新功能?
【发布时间】:2021-01-12 13:59:14
【问题描述】:

我正在使用 Spring Data JPA 将记录保存到我的数据库中。 这是我正在使用的方法:

@Override
public void persistOrder(final Order order) {
    orderRepository.save(order);
}

和我的存储库:

@Repository
public interface OrderRepository extends JpaRepository<Order, Long> {
    Optional<Order> findByOrderId(UUID orderId);
}

我想修改它以便保存或更新。这是我目前所拥有的:

@Override
public void saveOrUdpate(final Order order) {
  orderRepository.save(order);
  long id = orderRepository.findByOrderId(order.get()).getId();
  orderRepository.deleteById(id);
  orderRepository.save(order);
}

我有几个问题 -
#1 这是不好的做法(删除然后重新插入)吗?
#2 如果我使用休眠实现我的仓库,休眠的 saveOrUpdate(..) 会在引擎盖下做同样的事情吗?
#3 你知道我如何使用普通的 Spring Data Jpa 来实现这一点吗?

谢谢 :)

【问题讨论】:

  • 1.肯定是的。
  • 谢谢,我看到了,但是如何使用它来更新多个列?
  • @JohnnyAlpha 多列还是多行?列应该开箱即用。只需更改您的对象并保存它,所有列都应该更新。对于多行,JpaRepository 中应该有一个 saveAll 方法。
  • 您可以通过 id 获取现有数据,然后将现有数据映射到新数据,然后保存。您可以使用 ModelMapper 来映射模型。

标签: java spring hibernate spring-data-jpa relational-database


【解决方案1】:

更新::
好的,感谢cmets,我决定添加一个单独的更新方法!我认为这看起来更好!

 @Override
 public void updateOrder(Order order) {
    long id = orderRepository.findByOrderId(order.get().getId());
    order.setId(id);
    orderRepository.save(order);
}

关于 Spring Data JPA 的 save(..) 方法在默认情况下执行 upsert 时提出了一个很好的观点。但是,不幸的是,在我正在处理的项目中,主键是自动生成的。这意味着每当对现有记录执行 save(..) 以更新它时,都会创建一条新记录!这就是为什么我在这里明确设置 id 以避免这种情况发生!

我还在实体类中的 orderId 列(不是主键)中添加了 eclipse-link 库 @Index 注释以加快更新速度方法的 findByOrderId!

【讨论】:

  • 实际上,你可以用'@Transactional'注释你的更新方法,让spring管理所有的事务流。此外,您不需要调用“orderRepository.save()”,因为 spring 会关心保存您的实体。还有一件事。也许您不需要将持久对象的 ID 设置为您的补丁对象?您可以检查 - 实体字段是否已更新,如果该字段已更新,则将字段设置为数据库中的实体。
猜你喜欢
  • 2018-04-20
  • 2013-05-09
  • 2012-08-06
  • 1970-01-01
  • 2021-04-24
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
  • 2019-09-30
相关资源
最近更新 更多