如何使用 Spring Data Jpa 实现保存或更新功能?
How can I implement a Save Or Update function using Spring Data Jpa?
我正在使用 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 如果我使用 hibernate 实现我的 repo,hibernate saveOrUpdate(..) 会在后台做同样的事情吗?
#3 你知道我如何仅使用普通的 Spring Data Jpa 来实现这一点吗?
谢谢 :)
更新::
好的,感谢您的评论,我决定添加一个单独的更新方法!我觉得这样更好看!
@Override
public void updateOrder(Order order) {
long id = orderRepository.findByOrderId(order.get().getId());
order.setId(id);
orderRepository.save(order);
}
关于 Spring Data JPA 的 save(..) 方法默认执行更新插入的一个很好的观点。但是,不幸的是,在我正在处理的项目中,主键是自动生成的。这意味着每当对现有记录执行 save(..) 以更新它时,都会创建一条新记录!这就是为什么我在这里明确设置 id 以避免发生这种情况!
我还添加了 eclipse-link 库 @Index 注释到实体中的 orderId 列(不是主键) class 加快更新方法的 findByOrderId!
我正在使用 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 如果我使用 hibernate 实现我的 repo,hibernate saveOrUpdate(..) 会在后台做同样的事情吗?
#3 你知道我如何仅使用普通的 Spring Data Jpa 来实现这一点吗?
谢谢 :)
更新::
好的,感谢您的评论,我决定添加一个单独的更新方法!我觉得这样更好看!
@Override
public void updateOrder(Order order) {
long id = orderRepository.findByOrderId(order.get().getId());
order.setId(id);
orderRepository.save(order);
}
关于 Spring Data JPA 的 save(..) 方法默认执行更新插入的一个很好的观点。但是,不幸的是,在我正在处理的项目中,主键是自动生成的。这意味着每当对现有记录执行 save(..) 以更新它时,都会创建一条新记录!这就是为什么我在这里明确设置 id 以避免发生这种情况!
我还添加了 eclipse-link 库 @Index 注释到实体中的 orderId 列(不是主键) class 加快更新方法的 findByOrderId!