Java Hibernate-第二个查询提供请求的未知服务

Java Hibernate-第二个查询提供请求的未知服务,java,hibernate,session,hibernate-session,Java,Hibernate,Session,Hibernate Session,我正试图更好地理解Hibernate是如何工作的 我有个无法解决的问题 当应用程序启动时,它进行查询 Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); int result; String query = "SELECT count(*) as posti_disponibili from occupazione t inner join ";

我正试图更好地理解Hibernate是如何工作的

我有个无法解决的问题

当应用程序启动时,它进行查询

Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
int result;
String query = "SELECT count(*) as posti_disponibili from occupazione t inner join ";
query += "(select id_posto_park, max(date_time) as MaxDate from occupazione group by id_posto_park) tm on ";
query += "t.id_posto_park = tm.id_posto_park and t.date_time = tm.Maxdate and t.isOccupied = 0";

BigInteger bi = (BigInteger) session.createSQLQuery(query).uniqueResult();
result = bi.intValue();
HibernateUtil.shutdown();
最后,我关闭当前会话

之后,我还有第二个问题要完成:

我打开一个新会话(第一个会话是用方法
HibernateUtil.shutdown();
关闭的)

我不明白为什么,我关闭了第一个会议,但又打开了一个新的会议

关闭每个查询的会话是否正确

编辑 我试图解决这个问题,但没有结果

现在我有了第一个select查询,它进行得很顺利。这是在应用程序启动时

try {
    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    session.beginTransaction();

    String query = "SELECT count(*) as posti_disponibili from occupazione t inner join ";
    query += "(select id_posto_park, max(date_time) as MaxDate from occupazione group by id_posto_park) tm on ";
    query += "t.id_posto_park = tm.id_posto_park and t.date_time = tm.Maxdate and t.isOccupied = 0";

    BigInteger bi = (BigInteger) session.createSQLQuery(query).uniqueResult();
    result = bi.intValue();
}
我不承诺或冲掉它。 然后,在应用程序上,我有第二个查询,所以我获取currentsession并尝试执行select

Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Client client = new Client();
client.setIdClient(clientId);
String queryString ="from it.besmart.models.Client c where c.clientId = :c";
logger.debug(queryString);
// logger.debug(session);

Query theQuery = session.createQuery(queryString).setProperties(client);
List<?> list = theQuery.list();
会话会话=HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); 客户端=新客户端(); client.setIdClient(clientId); String queryString=“from.besmart.models.Client c,其中c.clientId=:c”; logger.debug(queryString); //调试(会话); Query theQuery=session.createQuery(queryString).setProperties(客户端); List=theQuery.List(); 应用程序停止,没有任何结果,我也不知道发生了什么,因为我无法将hibernate设置为使用pi4j登录。。。
我使用hibernate会话的方式有问题吗?

如果使用
sessionFactory.getCurrentSession()
,您将获得一个绑定到事务生命周期的“当前会话”,该会话将在事务结束时自动刷新和关闭(提交或回滚)

如果您决定使用
sessionFactory.openSession()
,则必须自己管理会话,并“手动”刷新和关闭会话


有关更多信息,请转到。

在第一种情况下,您可以调用
getCurrentSession()
,在第二种情况下,您可以调用
openSession()
。这是您想要的吗?我第一次调用getCurrentSession,查询就开始了。然后我关闭会话(正确吗?),为了进行新的查询,我必须调用openSession?对吗?为什么我会有例外?谢谢@Abdelhak我读了文档,但我一点也不懂。您说过事务在刷新或提交后关闭。我只是选择查询,所以不需要提交。这是否意味着我必须始终使用相同的会话,即使对于以下查询也是如此?
try {
    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    session.beginTransaction();

    String query = "SELECT count(*) as posti_disponibili from occupazione t inner join ";
    query += "(select id_posto_park, max(date_time) as MaxDate from occupazione group by id_posto_park) tm on ";
    query += "t.id_posto_park = tm.id_posto_park and t.date_time = tm.Maxdate and t.isOccupied = 0";

    BigInteger bi = (BigInteger) session.createSQLQuery(query).uniqueResult();
    result = bi.intValue();
}
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Client client = new Client();
client.setIdClient(clientId);
String queryString ="from it.besmart.models.Client c where c.clientId = :c";
logger.debug(queryString);
// logger.debug(session);

Query theQuery = session.createQuery(queryString).setProperties(client);
List<?> list = theQuery.list();