java - 如果已存在则更新实体或使用 spring jpa 创建
问题描述
我是弹簧数据 jpa 的新手。我有一个场景,如果不存在,我必须创建一个实体,或者根据非主键名称进行更新。下面是我为创建新实体而编写的代码,它工作正常,但如果一个已经存在的记录,它会创建重复。如果存在,如何编写更新方法,我通常从客户端获取记录列表。
@Override
@Transactional
public String createNewEntity(List<Transaction> transaction) {
List<Transaction> transaction= transactionRespository.saveAll(transaction);
}
解决方案
首先,这是来自 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);
推荐阅读
- azure - 在 Azure 函数(Http 触发器、Python 3)中,如何控制服务器可以处理的最大并发请求数?
- git - 使用 Git rebase 从功能分支 1 到分支 2 的更改
- java - Android Studio:将其重构为包后找不到类:在路径上找不到类“package.VideoPlayerFragment”:DexPathList
- javascript - 我无法使用 npx 创建 React Native 项目:react-native: command not found
- java - 是否可以同时拥有 localhost:8080 和 www?还是 www 表示它是公开的?
- firebase - 调用 Firebase.instance.verifyPhoneNumber() 导致颤振应用程序(android)崩溃
- r - R - 创建具有二元预测的 ROC 曲线
- javascript - Discord.js v12 警告命令;Math.floor 错误
- c++ - QT 自定义小部件悬停
- alibaba-cloud - 阿里巴巴云上的公共 DNS (IPv4) 是否用于其他云?