Данные только для чтения через Spring + Hibernate - PullRequest
6 голосов
/ 14 марта 2012

Заметил, что если я захочу прочитать некоторые данные и у меня нет контекста транзакции, я не смогу это сделать, потому что

org.hibernate.HibernateException: сеанс не найден для текущего потока

Для чтения данных, обычно не требуется транзакция.

Таким образом, чтобы Spring мог управлять сессией, ему нужна транзакция даже для операций только для чтения, таких как select ...?

Разве это не накладные расходы?

PS. Я не хочу открывать и закрывать сеанс вручную ...

Большое спасибо.

1 Ответ

4 голосов
/ 14 марта 2012

@Transactional сообщает Spring, чтобы открывать и закрывать сеанс, в дополнение к указанию запустить и зафиксировать транзакцию. Это не очень просто, но вот как это работает. Так что если у вас нет @Transactional, сессия не открывается. Вот ваши варианты:

  • use @Transactional(readOnly=true) - цель - сделать транзакцию только для чтения. Я рекомендую один
  • используйте JPA EntityManager, введенный с @PersistenceContext. Он откроет новый базовый сеанс для каждого вызова. Не очень хороший вариант. Но вы должны рассмотреть возможность использования EntityManager с транзакцией readOnly = true
  • Используйте дополнительный аспект / перехватчик / фильтр, чтобы открыть и закрыть сеанс. Это было бы сложно, и вы можете быть в замешательстве из-за весенней реализации концепции текущей сессии hibernate.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...