我正在尝试利用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()
时,我是否需要有一个开始事务然后提交甚至是这样的事情?是不是会产生很多开销?
答案 0 :(得分:1)
您的问题的简短答案:是和否。
更长的答案:
Hibernate要求您在执行任何操作时打开会话。只有在实际打开一个getCurrentSession()
时才能使用{{1}}。
为什么你认为它会产生很多开销?