Обновление до 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, кроме сущности.

Я предпочитаю нулевую проверку или проверку типа для решений, а не ловить и игнорировать.

Другие вопросы по тегам