我是spring data jpa的新手。我有一种情况,我必须创建一个实体(如果不存在)或根据非主键名称更新。下面是我编写的用于创建新实体的代码,它工作正常,但是如果已经存在存在记录,它会创建重复记录。如何编写一种方法来更新(如果存在),我通常会从客户端获取记录列表。
@Override
@Transactional
public String createNewEntity(List<Transaction> transaction) {
List<Transaction> transaction= transactionRespository.saveAll(transaction);
}
答案 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);