java Spring JPA:如何在不丢失数据的情况下进行upsert

lymgl2op  于 2022-12-25  发布在  Java
关注(0)|答案(2)|浏览(335)

是否有办法在不存在记录的情况下插入新记录,并在存在记录的情况下更新记录,而不会丢失旧数据?
这是我的服务层方法:

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注解能解决我的问题吗?

y53ybaqx

y53ybaqx1#

由于您已经在使用Spring和Spring-Data-Jpa,调用sampleRepository.save(sample);就足够了。保存方法首先根据实体的标识值检查传入的实体是新实体还是现有实体。标识由实体的主键定义。
你也可以使用EntityManager#merge方法,但是由于你已经在使用Spring Data,保存方法将在内部调用merge方法。
在我看来,您不需要使用@DynamicUpdate,除非您有太多的字段要更新,但实际上只有很少的字段被更新,并且与其他表有许多约束。
Spring BeanUtils与对象持久化无关,它主要是针对Java Bean的特定操作,如复制属性、查找Bean的方法、获取属性描述符等。
注:所以你不需要检查sample.getId()是否为空,也不需要用findOne方法从数据库中取出记录,只需要传递sampleRepository.save(sample)就可以保存/更新记录。

dtcbnfnu

dtcbnfnu2#

我更喜欢upsert而不是@DynamicUpdate。DynamicUpdate会带来性能开销和锁定问题,以防同时发出许多请求。

相关问题