【问题标题】:Hibernate - the second query gives Unknown service requestedHibernate - 第二个查询给出了未知的服务请求
【发布时间】:2015-11-13 17:51:04
【问题描述】:

我正在尝试更好地了解 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 登录... 我使用休眠会话的方式有问题吗?

【问题讨论】:

  • 在第一种情况下,您调用getCurrentSession(),在第二种情况下,您调用openSession()。这是你想要的吗?
  • 我第一次调用 getCurrentSession 并查询。然后我关闭会话(正确吗?)并进行新的查询,我必须调用 openSession?对?为什么我得到了例外?

标签: java hibernate session hibernate-session


【解决方案1】:

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

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

欲了解更多信息,请访问Hibernate transactions

【讨论】:

  • 谢谢@Abdelhak 我阅读了文档,但我什么也不懂。您说事务在刷新或提交后关闭。我只有 SELECT 查询,所以不需要提交。这是否意味着我必须始终使用同一个会话,即使对于以下查询也是如此?
猜你喜欢
  • 1970-01-01
  • 2012-05-03
  • 1970-01-01
  • 2014-12-15
  • 1970-01-01
  • 1970-01-01
  • 2015-12-10
  • 1970-01-01
  • 2014-08-05
相关资源
最近更新 更多