Я пытаюсь использовать Hibernate и пытаюсь избежать управления сеансом, используя getCurrentSession()
, который предоставляется API SessionFactory
. Насколько я понимаю, это будет управлять сеансом для меня. Моя проблема заключается в том, что при попытке использовать его вместо openSession()
я получаю сообщение об ошибке, говорящее о том, что мне нужна активная транзакция. В Интернете я читал противоречивые ответы, поэтому я все еще не уверен. Я пытаюсь выполнить запрос только для чтения (в основном выбор), зачем мне для этого нужна транзакция?
Error message: org.hibernate.HibernateException message: getNamedQuery is not valid without active transaction
Подробнее:
Hibernate.cfg.xml — фрагмент
<hibernate-configuration>
<session-factory name="hibernateSessionFactory">
<property name="connection.datasource">jdbc/DPARISC</property>
<property name="hibernate.dialect">org.hibernate.dialect.DB2Dialect</property>
<property name="hibernate.current_session_context_class">org.hibernate.context.ThreadLocalSessionContext</property>
<property name="hibernate.connection.isolation">1</property>
Ничего особенного в том, как мы создаем SessionFactory
config.buildSessionFactory();
Теперь вот где возникает проблема, в createQuery
Session session = HibernateUtil.getDB2SessionFactory().getCurrentSession();
Query query = session.createQuery(queryStringBuilder.toString())
.setParameter("orgId", request.getOrgId().intValue())
.setParameter("busUnitId", request.getBusinessUnitId().intValue());
query.setMaxResults(HibernateConstants.MAX_RESULTS);
Опять же, запрос — это просто оператор Select. Нужно ли мне начинать транзакцию, а затем фиксировать даже для таких вещей, когда я использую getCurrentSession()
? Разве это не создаст много накладных расходов?