org.hibernate.HibernateException:在Hibernate Search中进行索引时出错(在事务完成之前)

时间:2015-03-02 20:22:25

标签: java hibernate hibernate-search

我在使用hibernate的批处理事务中使用session.clear()时收到以下错误。

org.hibernate.HibernateException: Error while indexing in Hibernate Search (before transaction completion)

我使用以下代码

    try {
        for (TimeSheetEntity timeSheet : timeSheets) {
            timeSheet.setActive(false);
            try {
                session.update(timeSheet);

                count++;

                if (count % 250 == 0 || totalCount == count) {
                    System.out.println(count);

                    session.flush();
                    session.clear();
                }
            } catch (HibernateException ex) {
                logger.error(ArchiveImpl.class.getName(), ExceptionUtils.getStackTrace(ex) + "[" + timeSheet.getId() + "] ");
            } catch (Exception ex) {
                logger.error(ArchiveImpl.class.getName(), ExceptionUtils.getStackTrace(ex) + "[" + timeSheet.getId() + "] ");
            }
        }

        sessionManager.commit();
    } catch (HibernateException ex) {
        System.out.println(ex);
        logger.error(ArchiveImpl.class.getName(), ExceptionUtils.getStackTrace(ex));
        sessionManager.abort();
    } finally {
    }

现在,如果我删除session.clear();一切都按照它的设想运作。有什么想法,我可以在我的批处理事务中使用clear来进行hibernate搜索吗?

2 个答案:

答案 0 :(得分:3)

方法Session#flush()刷新对数据库的更改。 使用FullTextSession#flushToIndexes()

刷新对Hibernate Search管理的索引的更改

如果您需要清除()您的会话,您应该清除这两个,或者某些实体仍然会排队以进行索引但不再受管理,这是一个问题

当您对数据库进行刷新时,Hibernate Search不会自动刷新索引,因为如果您中止事务,则不会撤消对索引的刷新,因此如果您明确决定它会更好你希望发生哪一次(或两次)冲洗。

答案 1 :(得分:0)

好吧,你对session.clear();的电话是在for循环中。如果要关闭会话,请在循环结束后执行此操作。