Javax.persistence.PersistenceException: org.hibernate.type.SerializationException: не удалось десериализовать

При выполнении запроса Criteria Query в спящем режиме я получаю следующее исключение:

javax.persistence.PersistenceException: javax.persistence.PersistenceException: org.hibernate.type.SerializationException: could not deserialize: could not deserialize

В чем может быть проблема?

PS: хотя, возможно, и не актуально, моя версия спящего режима является окончанием hibernate-4.0.1.

Ответы

Ответ 1

Проблема заключалась в том, что ссылочный объект имел другую ссылку на сущность, и связь НЕ была аннотирована любой из аннотаций @OneToMany.

Ответ 2

Это исключение может возникать, когда hibernate получает данные неожиданного типа из результата запроса базы данных. Например, hibernate ожидает число, но вместо этого получает строку.

В этом случае обратите внимание на исключение StreamCorruptedException: "invalid stream header": 74657374 в stacktrace. Этот номер подскажет вам, но вы можете преобразовать его в текст с помощью таблицы ascii. 74 65 73 74 дает test как строку. Которая была значением столбца с аналогичным именем, но с совершенно другим типом. Таким образом, hibernate запрашивал неправильный столбец, который случайно существовал, поэтому первое исключение возникло не вместо column does not exist, а could not deserialize. Hibernate ожидал долгого времени, но вместо этого получил String.

Я попал в этот беспорядок, потому что правильный @Column(name="id_user") был проигнорирован, а hibernate вывел неверное имя столбца user из имени поля, которое не было idUser, а просто user с getUser() getter. Аннотацию игнорировали, поскольку она была указана на свойство getter вместо поля, которое ожидалось в спящем режиме, потому что сущность суперкласса аннотировала поле ID с @Id вместо идентификатора getter, что я безосновательно ожидал.

Ответ 3

В моем случае это была проблема с java.time.LocalDate из Java 8, и я забыл назначить конвертер этому конкретному атрибуту.

Кажется, что новые версии (5.2.1Final) имеют встроенный конвертер, поэтому могут помочь, если вы не привязаны к определенной версии.

Но проверка аннотаций - это, безусловно, путь, но я бы проверить их все.

Ответ 4

У меня есть свой класс UploadFiles класса, имеющий два поля: fid и fname, где fid является первичным ключом. У меня есть запрос в dao как

StringBuilder queryString = new StringBuilder("from UploadFiles f where f.fid=1");

Query query = (Query) session.createQuery(queryString.toString());          
return query.list();

когда он выполняет query.list(), он предоставляет исключение сериализации