首页 > 解决方案 > 如果已存在则更新实体或使用 spring jpa 创建

问题描述

我是弹簧数据 jpa 的新手。我有一个场景,如果不存在,我必须创建一个实体,或者根据非主键名称进行更新。下面是我为创建新实体而编写的代码,它工作正常,但如果一个已经存在的记录,它会创建重复。如果存在,如何编写更新方法,我通常从客户端获取记录列表。

@Override
@Transactional
public String createNewEntity(List<Transaction> transaction) {

   List<Transaction> transaction= transactionRespository.saveAll(transaction);
}

标签: javaspringspring-data-jpaspring-data

解决方案


首先,这是来自 google 复合键的意思

复合键是表中两列或多列的组合,可用于在列组合时唯一标识表中的每一行,但保证唯一性,但单独使用时不保证唯一性。

具有唯一键的复合键是一种浪费。

如果你想通过 jpa 更新一个实体,你需要一个 key 来分类实体是否已经存在。

    @Transactional
public <S extends T> S save(S entity) {
    if(this.entityInformation.isNew(entity)) {
        this.em.persist(entity);
        return entity;
    } else {
        return this.em.merge(entity);
    }
}

有两种方法可以处理您的问题。

如果更新时无法从客户端获取 id,则表示 id 失去了原有的功能。然后删除 id 字段上的注释@Id,使用@Id 设置名称。并且不要为其设置自动生成。

我认为您想要的是名称字段上的 @Column(unique = true,nullable = false) 。这就是更新某些东西的命令。

Transaction t = transactionRepository.findByName(name);
t.set.... //your update
transactionRepository.save(t);

推荐阅读