0

この休止状態エラーがランダムに表示されます。再現できません。

関連付けられたマネージド接続がすでにあります

そしてスタックトレースは次のように...

INFO   | jvm 1    | 2013/03/31 18:16:20 | org.hibernate.TransactionException: Transaction not successfully started
INFO   | jvm 1    | 2013/03/31 18:16:20 |       at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:170)
INFO   | jvm 1    | 2013/03/31 18:16:20 |       at com.xxx.sss.helpers.HibernateUtil.getObjectsByCriteria(HibernateUtil.java:54)

私のセレクターメソッドはこれです:

public static ArrayList<?> getObjectsByCriteria(String sqlQuery, List<Object> params, int firstResult, int maxSize)
{
    ArrayList<Object> result = null;
    try
    {
        SessionFactoryHelper.getSessionFactory().getCurrentSession().getTransaction().begin();
        Query q =  SessionFactoryHelper.getSessionFactory().getCurrentSession().createQuery(sqlQuery);

        if(params != null)
        {
            for (int i = 0; i < params.size(); i++)
            {
                q.setParameter(i, params.get(i));
            }
        }
        if(firstResult != -1 && maxSize != -1)
        {
            q.setFirstResult(firstResult);
            q.setMaxResults(maxSize);
        }
        q.setReadOnly(true);

        result = (ArrayList<Object>) q.list();

    }
    catch(HibernateException ex)
    {
        logger.log(Level.SEVERE, ex.getMessage());
        logQueryAndParams(sqlQuery, params);

    }
    catch(Exception ex)
    {
        logger.log(Level.SEVERE, ex.getMessage());
        logQueryAndParams(sqlQuery, params);

    }
    finally
    {
        if(!SessionFactoryHelper.getSessionFactory().getCurrentSession().getTransaction().wasCommitted())
            SessionFactoryHelper.getSessionFactory().getCurrentSession().getTransaction().commit();
    }
    return result;  
}

なぜこれを取得しているのか分かりますか?私はそれをグーグルで調べましたが、ほとんど反応がありません。私はSpringをTomcat/Hibernateだけで使用していません。

ありがとう!

4

3 に答える 3

0

catchエラーが発生した場合(ブロック内)にトランザクションをロールバックしないことに気付きました。ただし、これが問題の原因であるかどうかはわかりません。また、トランザクションを処理する通常の方法は、エラーが発生した場合に呼び出したくないためtry、ブロック内ではなくブロックの最後でコミットを行うことです。ここに例があります。finallycommit

于 2013-04-02T21:35:55.020 に答える
0

1 つには、Hibernate の Session クラスには 2 つの非常に重要な、しかし異なるメソッドがあります。1 つはsession.createQuery() createQuery() メソッドが、データベース テーブルにマップする Java オブジェクトを使用して、データベース上で HQL (Hibernate Query Language) ステートメントを実行することです。

ただし、上記のメソッドのパラメーター名を見ると、SQL クエリを実行しているように見えます。HQL クエリではありません。そのため、Session クラスによって提供される代替メソッドを使用する必要があります。

session.createSQLQuery()

したがって、HQL クエリではなく、データベースで SQL クエリを実行している場合、コードは次のようになります。

Query q =  SessionFactoryHelper.getSessionFactory().getCurrentSession().createSQLQuery(sqlQuery);

うまくいけば、それが違いを生むでしょう。

于 2013-04-02T17:41:22.037 に答える
0

このエラーは、JDBC 接続で既に実行中のトランザクションがあることを意味します。問題は、使用している @PersistenceContext アノテーションが原因である可能性があります。

@PersistenceContext(type = PersistenceContextType.EXTENDED) を置き換えます。

@PersistenceContext(type = PersistenceContextType.TRANSACTION) または @PersistenceContext を使用

于 2013-12-25T08:23:38.863 に答える