Java Hibernate-获取查询后会话关闭

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

我有一个用于所有Hibernate逻辑的中心类(我大部分都没有编写)。我们称之为HibCentral

我的代码使用此类从SQL字符串创建查询:

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();
    }