Как правильно использовать @Transactional?

240
01 марта 2017, 19:10

Изучаю Hibernate.

Я так понял, что транзакция гарантирует, что либо все данные этой транзакции будут сохранены, либо нет. Тогда логично использовать транзакции для операций, связанных с добавлением/обновлением данных в БД. Почему тогда я должен использовать аннотацию @Transactional для выполнения SELECT? Например:

UserDAO:

public class UserDAO {
    private SessionFactory sessionFactory;
public String getNameByUserId(int userId) {
    Session session = sessionFactory.getCurrentSession();
    Query query = session.createQuery("select u.name from User u where u.id=:userId");
    ...
    ...
    return name;
    }
}

UserService:

public class UserService {
    private UserDAO userDAO;
    @Transactional
    public String getNameByUserId(int userId) {
        return userDAO.getNameByUserId(userId);
    }
}

UPD:

Если я уберу @Transactional, то на строке Session session = sessionFactory.getCurrentSession(); будет выброшено исключение. Я так понял, что в этом случае мне нужно делать openSession() и close() вручную? А как тогда работает getCurrentSession()?

READ ALSO
Предупреждение с правильным кодом

Предупреждение с правильным кодом

Вывод статей происходит на двух страницах, 1 - превьюшные блоки, что и есть переход на опредстатью, а 2 - конкретная статья, где используется...

254