Назад к вопросам
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();
}