Комментарии 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 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.». Нет вывода с вашей стороны.
У меня вопрос: вы прервали повествование на «В этой связи была создана задача Revert optimizations made for existing entities in CrudRepository::save и внесены изменения: Revert DATAJPA-931.». Нет вывода с вашей стороны.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Spring Data JPA: что такое хорошо, и что такое плохо