Как стать автором
Обновить

Комментарии 12

Вот это реально годные советы к JPA! Спасибо, можно прямо составить личный краткий справочник how-to.

Не за что, наберу ещё материала — и будет вторая часть про кастомизацию репозиториев. Там тоже есть интересные моменты.

И вам спасибо!

BankAccount acc = repository.findById(id).orElseThow(NPE::new);
// ...
return repository.findById(id) // возьмём из наличия
.map(BankAccount::isAvailable)


Зачем тут вообще ходить еще раз через хибернейт и наступать на возможные грабли если у нас уже есть обьект acc.

Здесь для упрощения всё показано в одном методе, однако возможна (и мне подобные встречались) ситуация, когда у нас есть что-то вроде


BankAccount acc = repository.findById(id).orElseThow(NPE::new);
check(id);

public void (check) {
  boolean available = repository.findIfAvailable(id);
  if (!available) throw new IllegalStateException();
}

при чём всё это выполняется в одной транзакции (т.е. используется одна и та же сессия). Для неискушенного разработчика неочевидно, что второй repository.findById(id) возьмёт сущность из наличия.


Кстати, если метод очень большой и туда в разное время влезло несколько разработчиков, то и описанный мной вариант возможен почти дословно.

НЛО прилетело и опубликовало эту надпись здесь
И вам спасибо!

Мне кажется, что выбор между Spring Data JDBC и Spring Data JPA сродни выбору между ложкой и вилкой. И тем, и тем мы едим, но щи удобнее есть ложкой, а пельмени — вилкой.

Иными словами, выбирать нужно исходя из создавшегося положение и моя заметка как раз о случаях, когда лучше выбрать Spring Data JPA и не наступить на грабли.

spring-data-jpa: 2.1.5.RELEASE


SimpleJpaRepository {
    @Transactional
    public <S extends T> S save(S entity) {

        if (entityInformation.isNew(entity)) {
            em.persist(entity);
            return entity;
        } else {
            return em.merge(entity);
        }
    }
Не понял вашу мысль.
Открыт Spring Boot 2.1.«New», где всегда должен быть свежий Spring Data JPA. В нём всё как и было ранее.

У меня вопрос: вы прервали повествование на «В этой связи была создана задача Revert optimizations made for existing entities in CrudRepository::save и внесены изменения: Revert DATAJPA-931.». Нет вывода с вашей стороны.
Мой вывод: между работоспособностью приложения и улучшением производительности всегда нужно выбирать работоспособность.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.