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.

https://github.com/spring-projects/spring-data-jpa/blob/master/src/main/java/org/springframework/data/jpa/repository/support/SimpleJpaRepository.java

Это реализация репозитория по умолчанию и показывает, как @Transactional используется также в сгенерированных классах из ваших интерфейсов репозитория.

Почему вы думаете, что сохранение не является транзакционным?

Для людей, приходящих сюда с похожими симптомами (JpaRepository.saveничего не делать): проверьте реализациюTransactionManagerв вашей конфигурации.

Логика соединения транзакций не работает сDataSourceTransactionManager!

Я знаю, с чем работатьJpaTransactionManagerиJtaTransactionManager; возможно, другие могли бы расширить этот список.

Другие вопросы по тегам