Hibernate getCurrentSession() Мне действительно нужна транзакция для запроса только для чтения?

Я пытаюсь использовать 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()? Разве это не создаст много накладных расходов?


person FarscapePROJ    schedule 11.04.2014    source источник


Ответы (1)


Короткие ответы на ваши вопросы: да и нет.

Более длинные ответы:

Спящий режим требует, чтобы у вас был открыт сеанс, когда вы что-либо выполняете. Вы можете использовать getCurrentSession() только в том случае, если вы действительно его открыли.

Почему вы предполагаете, что это создает много накладных расходов?

person Kayaman    schedule 11.04.2014
comment
Однако из документации я подумал, что getCurrentSession либо откроет новый сеанс, если он не существует, либо, если он это сделает, он будет повторно использован. Мой вопрос был больше о стороне сделки. Если вы выдаете запрос после использования getCurrentSession, зачем мне нужно заключать его в транзакцию? - person FarscapePROJ; 11.04.2014
comment
Потому что чтение без транзакций может привести к таким вещам, как грязное чтение и другим проблемам. - person Kayaman; 11.04.2014