Sobes.tech
Назад к вопросам
Senior
3

Приходилось ли использовать @Transactional аннотацию в Hibernate? Расскажи про работу с транзакциями.

Компании, где спрашивали
Salmon

Ответ от нейросети

sobes.tech AI

Аннотация @Transactional в Hibernate (и Spring) используется для управления транзакциями на уровне метода или класса. Она гарантирует, что все операции с базой данных внутри метода выполняются в рамках одной транзакции.

При использовании @Transactional:

  • Транзакция автоматически начинается при входе в метод.
  • Если метод завершается успешно, транзакция коммитится.
  • Если возникает непроверяемое исключение (runtime exception), транзакция откатывается.

Это упрощает управление транзакциями и обеспечивает атомарность операций.

Пример:

@Service
public class UserService {

    @Transactional
    public void createUser(User user) {
        entityManager.persist(user);
        // другие операции с базой
    }
}

Важно помнить:

  • Транзакции должны быть короткими, чтобы не блокировать ресурсы.
  • Внутри транзакции можно работать с ленивыми связями без LazyInitializationException.
  • При использовании @Transactional на уровне сервиса лучше избегать вызовов изнутри того же класса (self-invocation), так как Spring прокси не сработает.

В Hibernate без Spring транзакции управляются через Session и Transaction вручную:

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
try {
    // операции
    tx.commit();
} catch (Exception e) {
    tx.rollback();
} finally {
    session.close();
}