Java 如何使用SpringDataJPA实现保存或更新功能?

Java 如何使用SpringDataJPA实现保存或更新功能?,java,spring,hibernate,spring-data-jpa,relational-database,Java,Spring,Hibernate,Spring Data Jpa,Relational Database,我正在使用SpringDataJPA将记录保存到数据库中。 以下是我正在使用的方法: @Override public void persistOrder(final Order order) { orderRepository.save(order); } 和我的存储库: @Repository public interface OrderRepository extends JpaRepository<Order, Long> { Optional<Ord

我正在使用SpringDataJPA将记录保存到数据库中。 以下是我正在使用的方法:

@Override
public void persistOrder(final Order order) {
    orderRepository.save(order);
}
和我的存储库:

@Repository
public interface OrderRepository extends JpaRepository<Order, Long> {
    Optional<Order> findByOrderId(UUID orderId);
}
我有几个问题-
#1是否存在这种不良做法(删除然后重新插入)
#2如果我使用hibernate实现我的repo,hibernate saveOrUpdate(..)会在后台做同样的事情吗
#3您知道我如何使用纯Spring数据Jpa实现这一点吗

谢谢:)

更新::
好的,谢谢你的评论,我决定添加一个单独的更新方法!我觉得这看起来好多了

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

SpringDataJPA的save(..)方法在默认情况下执行upsert,这是一个很好的观点。但是,不幸的是,在我正在处理的项目中,主键是自动生成的。这意味着每当对现有记录执行save(..)以更新它时,就会创建一个新记录!这就是我在这里显式设置id以避免这种情况发生的原因

我还向entity类中的orderId列(不是主键)添加了和eclipse link library@Index注释,以加快更新方法的findByOrderId

一,。当然可以。看到了。谢谢。我看到了,但是我如何使用它来更新多列?@JohnnyAlpha多列还是多行?Colums应该是开箱即用的。只要更改对象并保存它,所有列都应该更新。对于多行,JpaRepository中应该有一个saveAll方法。您可以按id获取现有数据,然后将现有数据映射到新数据,然后保存。您可以使用ModelMapper来映射模型。实际上,您可以用“@Transactional”注释您的更新方法,并让spring管理所有事务流。此外,您不需要调用“orderRepository.save()”,因为spring将关心保存您的实体。还有一件事。也许你不需要为你的补丁对象设置持久对象的ID?您只需检查实体的字段是否已更新,若该字段已更新,则可以从DB将字段设置为entity。
 @Override
 public void updateOrder(Order order) {
    long id = orderRepository.findByOrderId(order.get().getId());
    order.setId(id);
    orderRepository.save(order);
}