MarioC
MarioC

Reputation: 3228

Hibernate - the second query gives Unknown service requested

I'm trying to understand better how Hibernate works...

I've a problem I cannot resolve.

When the application starts, it makes a query

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

At the end I close the current session.

Then, after it, I have a second query to be accomplished:

I open a new session (the first one was closed with the method 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();

but I got, now,

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)

I cannot understand why, I closed the first session, but then opened a new one..

Is it correct to close the session on each query

EDIT I'm trying to solve this problem, but with no result.

Now I have the first select query, which goes well. It's at the startup of the application.

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

I do not commit or flush it. Then, going up with the application, I have the second query, so I getCurrentSession and try to do the 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();

The application stops, nothing comes out, I don't know what's going on also because I cannot setup hibernate to log with pi4j... Is there something wrong in how I use hibernate sessions?

Upvotes: 3

Views: 5992

Answers (1)

Abdelhak
Abdelhak

Reputation: 8387

If you use sessionFactory.getCurrentSession(), you'll obtain a "current session" which is bound to the lifecycle of the transaction and will be automatically flushed and closed when the transaction ends (commit or rollback).

If you decide to use sessionFactory.openSession(), you'll have to manage the session yourself and to flush and close it "manually".

For more info go to Hibernate transactions.

Upvotes: 2

Related Questions