有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java组织。冬眠HibernateException:在Hibernate搜索中编制索引时出错(在事务完成之前)

我在使用会话时收到以下错误。在使用hibernate的批处理事务中清除()

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

现在,如果我删除会话。清除();一切按预期进行。你知道为什么我不能在hibernate搜索的批处理事务中使用clear吗


共 (2) 个答案

  1. # 1 楼答案

    嗯,对session.clear();的调用在for循环中。如果要关闭会话,请在循环结束后关闭

  2. # 2 楼答案

    方法Session#flush()刷新对数据库的更改。 对Hibernate Search管理的索引的更改通过使用FullTextSession#flushToIndexes()刷新

    如果需要清除会话,则应同时刷新这两个会话,否则某些实体仍将排队编制索引,但不再进行管理,这是一个问题

    当您刷新数据库时,Hibernate Search不会自动刷新索引,因为如果您中止事务,则不会撤消对索引的刷新,因此最好明确决定要进行哪一次(或两次)刷新