org.hibernate.HibernateException:在 Hibernate Search 中建立索引时出错(在事务完成之前)
org.hibernate.HibernateException: Error while indexing in Hibernate Search (before transaction completion)
我在休眠批处理事务中使用 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 search 吗?
嗯,您对 session.clear();
的调用是在 for 循环中。如果要关闭会话,请在循环结束后执行。
方法Session#flush()
刷新对数据库的更改。
使用 FullTextSession#flushToIndexes()
.
刷新对 Hibernate Search 管理的索引的更改
如果你需要clear()你的session,你应该刷新这两个,否则一些实体仍然会被排队等待索引但不再被管理,这是个问题。
当您刷新到数据库时,Hibernate Search 不会自动刷新到索引,因为如果您中止事务,刷新到索引的操作将不会被撤消,所以最好明确地决定哪个(或两者)你想要发生的同花顺。
我在休眠批处理事务中使用 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 search 吗?
嗯,您对 session.clear();
的调用是在 for 循环中。如果要关闭会话,请在循环结束后执行。
方法Session#flush()
刷新对数据库的更改。
使用 FullTextSession#flushToIndexes()
.
如果你需要clear()你的session,你应该刷新这两个,否则一些实体仍然会被排队等待索引但不再被管理,这是个问题。
当您刷新到数据库时,Hibernate Search 不会自动刷新到索引,因为如果您中止事务,刷新到索引的操作将不会被撤消,所以最好明确地决定哪个(或两者)你想要发生的同花顺。