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



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

这是我的回购:

@Repository
@Transactional
public interface CricketPlayerRepository extends CrudRepository<CricketPlayer,String>  {
Optional<CricketPlayer> findCricketPlayerByName(String name);

}

这是我的服务:

@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);
}
}
hibernate(和其他框架(中的保存和更新操作基于id值。如果id存在,则合并(更新(实体,否则保存新实例。因此,不能在这种情况下这样做。

1(如果PlayerId是主键id,那么您将调用merge(实体(。如果存在PlayerId,它将更新,否则它将创建新记录。

2( 如果PlayerId不是主键id。最佳做法是避免将PlayerId作为主键。

在poster中,您应该传递数据库表主键id和PlayerId。然后调用merge(实体(。它将负责基于主键创建或更新id是否为null。

例如,如果您在请求中传递了主键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

最新更新