Java Hibernate-获取查询后会话关闭
我有一个用于所有Hibernate逻辑的中心类(我大部分都没有编写)。我们称之为HibCentral 我的代码使用此类从SQL字符串创建查询:Java Hibernate-获取查询后会话关闭,java,sql,hibernate,session,Java,Sql,Hibernate,Session,我有一个用于所有Hibernate逻辑的中心类(我大部分都没有编写)。我们称之为HibCentral 我的代码使用此类从SQL字符串创建查询: public class HibCentral { ...some hibernate setup and other methods... @Transactional public Query createSQLQuery(final String sql) { return getCurrentSessi
public class HibCentral {
...some hibernate setup and other methods...
@Transactional
public Query createSQLQuery(final String sql) {
return getCurrentSession().createSQLQuery(sql);
}
}
getCurrentSession()
只需调用sessionFactory.getCurrentSession()
我的类(我们称之为MyClass
)由一个高级服务(service
)调用。它获取一个SQL字符串,调用此方法获取查询,填充其参数,并将其发送回服务。然后,服务使用query.list()
调用查询
但请稍候,会话已关闭
我还尝试将list()
调用移动到Hibernate逻辑类:
public class HibCentral {
....other methods....
@Transactional
public List list(final Query query) {
return query.list();
}
}
但这产生了相同的“会话已关闭”错误
我该怎么做才能使它工作?问题是只有
HibCentral
类中的方法是事务性的,这意味着数据库连接的打开和关闭仅用于执行这些方法。在此之后,连接将被关闭,并且在这些方法之外与Hibernate元素(如Query
)的任何交互都不会有有效的连接,您将得到这些错误
解决方案:将
@Transactional
注释移动到更高级别。这通常应该是在服务层。如果服务层中的类彼此交互,则将@Transactional
移动到更高的级别,以避免打开和关闭许多连接。使用@Transactional
时,除非指定@Transactional(传播=传播.必需)
,否则它将应用于方法
一旦方法调用完成,事务就被关闭,会话也随之结束。您应该创建查询,获取列表并以相同的方法返回
@Transactional
public List createSQLQuery(final String sql) {
Query query = getCurrentSession().createSQLQuery(sql);
return q.list();
}
干杯 哪里是尖锐的错误抛出?是在会话关闭时还是在调用
list()
时?
@Transactional
public List createSQLQuery(final String sql) {
Query query = getCurrentSession().createSQLQuery(sql);
return q.list();
}