Ответ 1
Проблема заключалась в том, что ссылочный объект имел другую ссылку на сущность, и связь НЕ была аннотирована любой из аннотаций @OneToMany
.
При выполнении запроса Criteria Query в спящем режиме я получаю следующее исключение:
javax.persistence.PersistenceException: javax.persistence.PersistenceException: org.hibernate.type.SerializationException: could not deserialize: could not deserialize
В чем может быть проблема?
PS: хотя, возможно, и не актуально, моя версия спящего режима является окончанием hibernate-4.0.1.
Проблема заключалась в том, что ссылочный объект имел другую ссылку на сущность, и связь НЕ была аннотирована любой из аннотаций @OneToMany
.
Это исключение может возникать, когда 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, что я безосновательно ожидал.
В моем случае это была проблема с java.time.LocalDate
из Java 8, и я забыл назначить конвертер этому конкретному атрибуту.
Кажется, что новые версии (5.2.1Final) имеют встроенный конвертер, поэтому могут помочь, если вы не привязаны к определенной версии.
Но проверка аннотаций - это, безусловно, путь, но я бы проверить их все.
У меня есть свой класс 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()
, он предоставляет исключение сериализации