Сохранение и обновление в репозитории jpa CRUD - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть данные, уже сохраненные в моей базе данных на основе моего хранилища и службы. Я хочу сохранить другие данные с почтальоном, изменив только идентификатор игрока. Но это не создание новых данных объекта. Это обновление существующих данных объекта .Мой вопрос - как обновить данные моей службой, когда он находит существующий идентификатор. Но когда он находит новый идентификатор, он сохраняет новые данные в базе данных.

Это мой репо:

@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);
    }

}

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

1) Если PlayerId является идентификатором первичного ключа, то вы бы вызвали merge (entity). Если PlayerId присутствует, он обновится, иначе он создаст новую запись.

2) Если PlayrerId не является идентификатором первичного ключа. Лучше всего избегать использования PlayerId в качестве первичного ключа.

В почтальоне вы должны передать идентификатор первичного ключа таблицы базы данных вместе с PlayerId. Затем вы вызываете слияние (сущность). Он позаботится о создании или обновлении на основе первичного ключа идентификатор равен нулю или нет.

например, ниже, если вы передали идентификатор первичного ключа в запросе.

    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
0 голосов
/ 04 ноября 2018

операции сохранения и обновления в спящем режиме (и других платформах) основаны на значении идентификатора. если идентификатор существует, объединить (обновить) сущность и в противном случае сохранить новый экземпляр. Так что это не может быть сделано в этом контексте.

...