Java 在jpa CRUD存储库中保存和更新

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

基于我的存储库和服务,我的数据库中已经保存了一个数据。我想通过仅更改玩家id来与postman一起保存另一个数据。但这不是创建新实体数据。它会更新现有实体数据。我的问题是,当我的服务找到现有id时,如何通过它更新数据。但当它找到新id时,它会保存一个数据将新数据输入数据库

这是我的回购协议:

@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,但这是不合理的。谢谢