Spring JPA нет @Transnational при сохранении JpaRepository
По умолчанию определяемые пользователем методы репозитория доступны только для чтения, модифицирующие запросы переопределяются @Transactional, пример из SimpleJpaRepository из весны:
@Repository
@Transactional(readOnly = true)
public class SimpleJpaRepository<T, ID> implements JpaRepository<T, ID>, JpaSpecificationExecutor<T> {
*/
@Transactional
public <S extends T> S save(S entity) {
if (entityInformation.isNew(entity)) {
em.persist(entity);
return entity;
} else {
return em.merge(entity);
}
}
Я заметил, что JpaRepository не отменяет сохранение с помощью @Transactional:
@NoRepositoryBean
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
метод сохранения находится внутри CrudRepository
(здесь нет транснациональных)
/**
* Saves a given entity. Use the returned instance for further operations as the save operation might have changed the
* entity instance completely.
*
* @param entity must not be {@literal null}.
* @return the saved entity will never be {@literal null}.
*/
<S extends T> S save(S entity);
Итак, как работает метод save при расширении JpaRepository без примера @Transnational:
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}
здесь нет транзакций
@Override
public void test() {
{
User user=new User();
user.setName("hello");
user.setLastName("hello");
user.setActive(1);
user.setPassword("hello");
user.setEmail("hello@hello.com");
userRepository.save(user);
}
}
2 ответа
Посмотрите на SimpleJpaRepository.
Это реализация репозитория по умолчанию и показывает, как @Transactional используется также в сгенерированных классах из ваших интерфейсов репозитория.
Почему вы думаете, что сохранение не является транзакционным?
Для людей, приходящих сюда с похожими симптомами (JpaRepository.save
ничего не делать): проверьте реализациюTransactionManager
в вашей конфигурации.
Логика соединения транзакций не работает сDataSourceTransactionManager
!
Я знаю, с чем работатьJpaTransactionManager
иJtaTransactionManager
; возможно, другие могли бы расширить этот список.