更新实体(如果已存在)或使用spring jpa创建

时间:2018-12-27 02:29:33

标签: java spring spring-data-jpa spring-data

我是spring data jpa的新手。我有一种情况,我必须创建一个实体(如果不存在)或根据非主键名称更新。下面是我编写的用于创建新实体的代码,它工作正常,但是如果已经存在存在记录,它会创建重复记录。如何编写一种方法来更新(如果存在),我通常会从客户端获取记录列表。

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

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

2 个答案:

答案 0 :(得分:1)

在交易实体上添加名为name的变量,以将其命名为唯一变量:

(2) […]
​0: Object { text: "demo CLIENT 1", id: 1 }
​1: Object { text: "demo CLIENT 2", id: 2 }

然后,您将无法为“名称”列添加重复的值。

答案 1 :(得分:1)

首先,这是来自google组合键的手段

  

组合键是表中两列或更多列的组合,当保证组合列的唯一性时,可用于唯一标识表中的每一行,但单独使用时,它不能保证唯一性。 / p>

具有唯一键的复合键很浪费。

如果要通过jpa更新实体,则需要有一个密钥来对实体是否已经存在进行分类。

    @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);
相关问题