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

最後に、現在のセッションを閉じます。

その後、2 番目のクエリを実行する必要があります。

新しいセッションを開きます (最初のセッションはメソッドで閉じられました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();
}

私はそれをコミットしたりフラッシュしたりしません。次に、アプリケーションを起動すると、2 番目のクエリがあるので、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 に答える