2

我试图更好地理解 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();

Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Client client = new Client();
client.setIdClient(clientId);
String queryString ="from it.besmart.models.Client where clientId = :c)";
List<?> list = session.createQuery(queryString).setProperties(client).list();

但我得到了,现在,

org.hibernate.service.UnknownServiceException: Unknown service requested [org.hibernate.cache.spi.RegionFactory]
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:184)
at org.hibernate.cfg.Settings.getRegionFactory(Settings.java:300)
at org.hibernate.internal.SessionFactoryImpl$SessionBuilderImpl.openSession(SessionFactoryImpl.java:1322)
at org.hibernate.internal.SessionFactoryImpl.openSession(SessionFactoryImpl.java:677)
at it.besmart.parkserver.SocketClientHandler.run(SocketClientHandler.java:78)
at java.lang.Thread.run(Thread.java:744)

我不明白为什么,我关闭了第一个会话,然后又打开了一个新会话..

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

编辑 我正在尝试解决这个问题,但没有结果。

现在我有了第一个选择查询,一切顺利。它在应用程序启动时。

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

我不提交或刷新它。然后,使用应用程序,我有第二个查询,所以我 getCurrentSession 并尝试进行选择

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

应用程序停止,没有任何结果,我也不知道发生了什么,因为我无法设置休眠以使用 pi4j 登录...我使用休眠会话的方式有什么问题吗?

4

1 回答 1

2

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

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

有关更多信息,请转到Hibernate 事务

于 2015-11-13T18:34:39.153 回答