Spring JPA:如何在不丢失数据的情况下进行更新插入

Posted

技术标签:

【中文标题】Spring JPA:如何在不丢失数据的情况下进行更新插入【英文标题】:Spring JPA: How to upsert without losing data 【发布时间】:2016-07-14 11:05:39 【问题描述】:

有没有办法在不存在的情况下插入新记录,如果存在则更新记录而不丢失旧数据?

这是我的服务层方法:

public void saveSample(Sample sample) 
    Sample samplePersistent = sample;

    if (sample.getId() != null) 
        samplePersistent = sampleRepository.findOne(sample.getId());
        Assert.notNull(samplePersistent, "Sample entity not found with id : " + sample.getId());

        samplePersistent.setLocation(sample.getLocation());
        samplePersistent.setName(sample.getName());
        samplePersistent.setType(sample.getType());
        ...
        ...

    

    samplePersistent.cloneAuditingInfoFrom(sample);
    sampleRepository.save(sample);

我认为这是没用的方法。

Spring BeanUtils 类或@DynamicUpdate 注解能解决我的问题吗?

【问题讨论】:

【参考方案1】:

由于您已经在使用 Spring 和 Spring-Data-Jpa,因此调用 sampleRepository.save(sample); 就足够了。 save 方法首先根据实体的标识值检查传入的实体是新实体还是现有实体。身份由实体的主键定义。

您也可以使用EntityManager#merge 方法。但是由于您已经在使用 Spring Data,save 方法将在内部调用 merge 方法。

在我看来,您不需要使用@DynamicUpdate,除非您有很多字段要更新,但实际上只有少数字段正在更新,并且对其他表也有很多限制。

Spring BeanUtils 与对象持久性无关。它主要针对Java bean 特定的操作,如复制属性、查找bean 的方法、获取属性描述符等。

P.S: 所以你不需要检查sample.getId() 是否为空,并使用findOne 方法从数据库中获取记录。只需传递sampleRepository.save(sample) 即可保存/更新记录。

【讨论】:

以上是关于Spring JPA:如何在不丢失数据的情况下进行更新插入的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用查询缓存的情况下缓存 Spring Data JPA 查询方法的结果?

Mysql:如何在不丢失组内个人行的情况下对组进行排序[关闭]

是否可以在不使用 Spring Boot JPA 的情况下测试基于 java 的 CRUD?

在不丢失 Spring Jackson 配置的情况下设置 WebClient.Builder.exchangeStrategies()

在不丢失数据的情况下处理屏幕旋转 - Android

如何在不丢失未保存工作的情况下锁定 Web 应用程序进行维护?