Ответ 1
Ты прав. Только методы CRUD (CrudRepository
) по умолчанию помечены как транзакционные.
Если вы используете пользовательские методы запроса, вы должны явно пометить его аннотацией @Transactional
.
@Repository
public interface UserRegistrationRepository extends JpaRepository<UserRegistration, Long> {
UserRegistration findByEmail(String email);
@Transactional
void deleteByEmail(String email);
}
Вы также должны знать о последствиях маркировки методов интерфейса репозитория вместо методов обслуживания. Если вы используете конфигурацию распространения транзакций по умолчанию (Propagation.REQUIRED
), то:
Конфигурация транзакции в репозиториях будет игнорироваться затем, поскольку конфигурация внешней транзакции определяет фактическую используется.
http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#transactions
Если вам нужна дополнительная информация о том, как она реализована, взгляните на реализацию по умолчанию CrudRepository
/JpaRepository
- SimpleJpaRepository
(которую вы, вероятно, используете):
Интересные строки здесь:
@Transactional(readOnly = true)
public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID> {
и некоторые из транзакционных методов здесь:
@Transactional
public void deleteById(ID id) {
@Transactional
public <S extends T> S save(S entity) {