Java 在jpa CRUD存储库中保存和更新
基于我的存储库和服务,我的数据库中已经保存了一个数据。我想通过仅更改玩家id来与postman一起保存另一个数据。但这不是创建新实体数据。它会更新现有实体数据。我的问题是,当我的服务找到现有id时,如何通过它更新数据。但当它找到新id时,它会保存一个数据将新数据输入数据库 这是我的回购协议:Java 在jpa CRUD存储库中保存和更新,java,hibernate,spring-boot,spring-data-jpa,crud,Java,Hibernate,Spring Boot,Spring Data Jpa,Crud,基于我的存储库和服务,我的数据库中已经保存了一个数据。我想通过仅更改玩家id来与postman一起保存另一个数据。但这不是创建新实体数据。它会更新现有实体数据。我的问题是,当我的服务找到现有id时,如何通过它更新数据。但当它找到新id时,它会保存一个数据将新数据输入数据库 这是我的回购协议: @Repository @Transactional public interface CricketPlayerRepository extends CrudRepository<CricketPl
@Repository
@Transactional
public interface CricketPlayerRepository extends CrudRepository<CricketPlayer,String> {
Optional<CricketPlayer> findCricketPlayerByName(String name);
}
@存储库
@交易的
公共接口CricketPlayerRepository扩展了Crudepository{
可选的FindRicketPlayerByName(字符串名称);
}
这是我的服务:
@Service
public class CricketPlayerService {
private CricketPlayerRepository cricketPlayerRepository;
public CricketPlayerService(CricketPlayerRepository cricketPlayerRepository) {
super();
this.cricketPlayerRepository = cricketPlayerRepository;
}
public CricketPlayerService() {
}
public Optional<CricketPlayer> getPlayerByName(String name){
return cricketPlayerRepository.findCricketPlayerByName(name);
}
public CricketPlayer save(CricketPlayer cricketPlayer){
Optional<CricketPlayer> id = cricketPlayerRepository.findById(cricketPlayer.getPlayerId());
if (id.isPresent()){
//code here
}
// if (entityManager.isNew(cricketPlayer)) {
// em.persist(cricketPlayer);
// return cricketPlayer;
// } else {
// return em.merge(cricketPlayer);
// }
return cricketPlayerRepository.save(cricketPlayer);
}
public Iterable<CricketPlayer> findAllPlayers() {
return cricketPlayerRepository.findAll();
}
public Optional<CricketPlayer> findPlayersById(String id) {
return cricketPlayerRepository.findById(id);
}
}
@服务
公共级板球运动员服务{
私人板球运动员安置所板球运动员安置所;
公共板球运动员服务(板球运动员位置板球运动员位置){
超级();
this.cricketPlayerRepository=cricketPlayerRepository;
}
公共板球运动员服务(){
}
公共可选getPlayerByName(字符串名称){
返回cricketPlayerRepository.findCricketPlayerByName(名称);
}
公众板球运动员保存(板球运动员板球运动员){
可选id=cricketPlayerRepository.findById(cricketPlayer.getPlayerId());
if(id.isPresent()){
//代码在这里
}
//if(entityManager.isNew(板球运动员)){
//em.persist(板球运动员);
//返回板球运动员;
//}其他{
//返回em.merge(板球运动员);
// }
返回板球运动员位置。保存(板球运动员);
}
public Iterable findAllPlayers(){
返回cricketPlayerRepository.findAll();
}
公共可选FindPlayerById(字符串id){
返回cricketPlayerRepository.findById(id);
}
}
hibernate(和其他框架)中的保存和更新操作基于id值。如果存在id,则合并(更新)实体,否则保存新实例。因此,在这种情况下是不可能做到的 1)如果PlayerId是主键id,那么您应该调用merge(entity)。如果PlayerId存在,它将更新,否则它将创建新记录
2) 如果PlayerId不是主键id。最佳做法是避免将PlayerId作为主键
在postman中,您应该传递数据库表主键id和PlayerId。
然后调用merge(实体)。它将负责基于主键的创建或更新
id是否为空
例如,如果您在请求中传递了主键id,则如下所示
Entity e = new Entity();
if (entityFromRequest.getId() != null){ //this is the db id from request
//get the entity from db and then change the state
e = entity from db by using id
}
e.setPlayerId = entityFromRequest.getPlayerId
merge(e); // it will create or update record
那是一些文字的图片。。。?如果你觉得有帮助的话,也许你可以把这篇文章发出来。“这是我的项目。有人帮我吗?那逻辑是什么?”尼罗布拉森说。1.如果数据库中存在您的数据,请首先获取该数据并将其值分配给其他实体。2.如果数据库中不存在数据,请创建新实体保存,然后将其值分配给其他实体。3.不要试图更改表中某行的id列,因为id列用于区分常规表中的不同行。最后,如果您坚持要更改它的值,您可以使用JDBCpure,但这是不合理的。谢谢