hibernate IllegalStateException:会话/会话管理器已关闭

pxiryf3j  于 2023-11-21  发布在  其他
关注(0)|答案(2)|浏览(110)

我试图用Hibernate实现他的Java代码,以便进行SQL查询:

public List<AttendeeModel> getListOfCds(int firstRow, int rowCount) {
        List<AttendeeModel> cdList = null;
        try {
            session.beginTransaction();
            Criteria criteria = session.createCriteria(AttendeeModel.class);
            criteria.setFirstResult(firstRow);
            criteria.setMaxResults(rowCount);
            if (criteria != null) {
                cdList = (List<AttendeeModel>) criteria.list();
            }
            session.getTransaction().commit();
        } catch (Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }
        return cdList;
    }

    public int countRows() {
        try {
            session.beginTransaction();
            Criteria criteria = session.createCriteria(AttendeeModel.class);
            if (criteria != null) {
                return criteria.list().size();
            }
            session.getTransaction().commit();
        } catch (Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }
        return 0;
    }

字符串
但由于某种原因,我得到了这个错误:

java.lang.IllegalStateException: Session/EntityManager is closed


你知道我如何解决这个问题吗?

mitkmikd

mitkmikd1#

从你的代码中,不清楚session在哪里被声明,以及它是如何被填充的。考虑到这在某种程度上是正确的,我怀疑在countRow中返回之前缺少transaction commit/rollback会导致异常,尝试:

public int countRows() {
    int size = 0;
    try {
        session.beginTransaction();
        Criteria criteria = session.createCriteria(AttendeeModel.class);
        if (criteria != null) {
            size = criteria.list().size();
        }
        session.getTransaction().commit();
    } catch (Exception e) {
        e.printStackTrace();
        session.getTransaction().rollback();
    }
    return size;
}

字符串

oo7oh9g9

oo7oh9g92#

如果只使用@PersistenceContext,则无法正常工作,我们还需要设置PersistenceContextType,默认为TRANSACTION,但在这种情况下,当多个线程尝试使用EntityManager的同一个单例示例时,我们需要像这样将其设置为EXTENDED-

@PersistenceContext(type = PersistenceContextType.EXTENDED)
private EntityManager entityManager;

字符串
而且它起作用了。当我试图在我的一个数据库中执行db查询时,我遇到了这个问题。

相关问题