Обновление до Hibernate 5.1 с версии 3.6 создает экземпляр объекта Non-entity, переданный для исключения исключения
Я работал с проектом hibernate 3.6, который использует аннотации для сопоставления, и теперь я переношу его на hibernate 5.1, и у меня есть это исключение времени выполнения Экземпляр объекта не-сущности, переданный на выселение Ниже приведен вызов выселения
HibernateUtils.getSession().evict(origProject.getProbidinfo());
HibernateUtils.getSession().evict(origProject);
И ниже приведен код из DefaultEvictEventListener.class, откуда выбрасывается исключение.
EntityPersister persister = null;
final String entityName = persistenceContext.getSession().guessEntityName( object );
if ( entityName != null ) {
try {
persister = persistenceContext.getSession().getFactory().getEntityPersister( entityName );
}
catch (Exception ignore) {
}
}
if ( persister == null ) {
throw new IllegalArgumentException( "Non-entity object instance passed to evict : " + object );
}
где persister имеет значение null в моем случае в спящем режиме 5.1. Я могу предоставить более подробную информацию, если вам не ясно
2 ответа
Исключение "Экземпляр объекта, не являющегося объектом, переданный для выселения", игнорировался спящим режимом до версии 4.2, которая теперь выдает:
java.lang.IllegalArgumentException: экземпляр объекта, не являющегося сущностью, передан в команду evict.
В версиях гибернации до 4.2 он игнорировался из-за отсутствия части else для DefaultEvictEventListener.java #L91-L94.
Начиная с версии 4.2, была добавлена часть else, как мы видим в DefaultEvictEventListener.java #L99-L115.
Единственное предложение, которое я нашел в Интернете после исследования этой ошибки, - это перехватить и игнорировать это исключение.
Однако, даже если это не идеальное решение, я думаю, что я предпочитаю пропустить вызов выселения, из-за которого возникает исключение, поскольку я могу, чтобы это было в кеше.
Hibernate проверяет, что переданный вами объект является сущностью, поэтому он не хочет исключать или отсоединять какой-либо объект (в моем случае это был ArrayList) или null, кроме сущности.
Я предпочитаю нулевую проверку или проверку типа для решений, а не ловить и игнорировать.