根据我的存储库和服务,我的数据库中已经保存了一个数据。我想通过只更改玩家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);
}
}
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