Hibernate getCurrentSession()我真的需要一个只读类型的查询事务吗?

时间:2014-04-11 15:31:19

标签: java sql hibernate transactions hibernate-mapping

我正在尝试利用Hibernate并尝试使用API​​ getCurrentSession()提供的SessionFactory来避免会话管理。据我了解,这将为我管理会议。我的问题是当试图用它代替openSession()时,我收到一个错误,说我需要有一个活动的交易。在线我已经阅读了相互矛盾的答案,所以我仍然不确定。我正在尝试执行只读查询(基本上是一个选择),为什么我需要一个事务呢?

Error message: org.hibernate.HibernateException message: getNamedQuery is not valid without active transaction

更多详情:

Hibernate.cfg.xml - snippet

<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()时,我是否需要有一个开始事务然后提交甚至是这样的事情?是不是会产生很多开销?

1 个答案:

答案 0 :(得分:1)

您的问题的简短答案:是和否。

更长的答案:

Hibernate要求您在执行任何操作时打开会话。只有在实际打开一个getCurrentSession()时才能使用{{1}}。

为什么你认为它会产生很多开销?