Я использую Hibernate 4.3.0.Final/JPA 2.1, Hibernate Search 4.5.0.Final, работающий на WildFly 8.0.0.Final. Мое приложение работает абсолютно нормально, но я получаю предупреждение о переходе в спящий режим при создании индексов.
ПРЕДУПРЕЖДЕНИЕ org.hibernate.loader.Loader — HHH000444: Обнаружен запрос на блокировку, однако диалект сообщает, что база данных предпочитает, чтобы блокировка выполнялась в отдельном выборе (последующая блокировка); результаты будут заблокированы после выполнения первоначального запроса
Это метод, который создает индекс:
public void createIndex() throws DAOException {
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(this.entityManager);
try {
fullTextEntityManager.createIndexer(Colaborador.class)
.purgeAllOnStart(Boolean.TRUE)
.optimizeOnFinish(Boolean.TRUE)
.startAndWait();
}
catch (InterruptedException e) {
logger.error("Error creating index", e);
throw new DAOException(e);
}
}
Я провел несколько поисков и нашел «решение» или, лучше сказать, способ подавить предупреждение. Однако я не знаю, является ли это лучшим решением. Решение предлагает расширить org.hibernate.dialect.Oracle10gDialect
и переопределить метод public boolean useFollowOnLocking()
, чтобы вернуть false
.
Другая важная вещь: это происходит только после версии Hibernate 4.2.0.Final. До этой версии не существовало метода useFollowOnLocking()
.
Новый диалект:
import org.hibernate.dialect.Oracle10gDialect;
public class MyOracle10gDialect extends Oracle10gDialect {
@Override
public boolean useFollowOnLocking() {
return false;
}
}
Я нашел это решение здесь и здесь. Существует также отчет об ошибке, который был отклонен по поводу этого предупреждения. Я не нашел другого решения для этого предупреждения.