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

知道为什么我会得到这个吗?我用谷歌搜索了它,但很少有回应。我没有直接使用 Tomcat/Hibernate 的 Spring。

谢谢!

4

3 回答 3

0

我注意到,如果发生错误(在catch块内),您永远不会回滚事务。我不确定这是否是您的问题的原因。此外,处理事务的通常方法是在块的末尾而try不是在块中进行提交,因为如果出现错误finally,您不想调用。这是一个例子commit

于 2013-04-02T21:35:55.020 回答
0

一方面,Hibernate 的 Session 类有两个非常重要但又截然不同的方法。一种是session.createQuery() createQuery() 方法使用映射到数据库表的 Java 对象在数据库上执行 HQL(Hibernate 查询语言)语句。

但是,在上面的方法中查看你的参数名称,似乎你正在执行一个 SQL 查询;不是 HQL 查询。因此,必须使用 Session 类提供的替代方法:

session.createSQLQuery()

因此,如果您在数据库上执行 SQL 查询,而不是 HQL 查询,那么您的代码将如下所示:

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 回答