Почему Hibernate не генерирует DDL со столбцом для serialVersionUID?

Я получаю этот DDL (цель postgres), когда добавляю цель hbm2ddl с помощью плагина Maven hibernate3-maven-plugin:

create table listing (
    id varchar(36) not null,
    hash_code int4 not null,
    version int4,
    name varchar(100),
    primary key (id)
);

Я определил все показанные столбцы.

Все примеры использования, которые я видел в Интернете:

private static final long serialVersionUID = -8402611044513083864L;

никогда не используйте аннотацию @Column. В моем DDL нет столбца для него. Кто-нибудь еще?

Итак, как код десериализации в Java узнает, какая версия класса была сериализована и сохранена по сравнению с той, в которую он десериализуется?


person Dennis    schedule 11.12.2011    source источник


Ответы (2)


UID серийной версии используется при сериализации/десериализации объекта.

Если вы аннотируете свой объект как объект JPA, вы не используете сериализацию, а просто преобразуете свой объект в другое представление — в виде строки в таблице базы данных.
Когда вы выбираете строку из база данных, эти данные используются для создания нового экземпляра объекта с правильно установленным состоянием.

С другой стороны, сериализация используется, если вы хотите создать двоичное представление вашего объекта, а затем воссоздать экземпляр объекта с помощью процесса десериализации.

Обратите внимание, что вы можете использовать сериализацию с JPA, т. е. если вы хотите сохранить поле (внутри вашего объекта JPA), которое не является ни базовым типом, ни встраиваемым, ни другим объектом, а просто классом Java, который реализует маркер Serializable. interface.
Однако в этом случае только это заданное поле в вашей сущности использует сериализацию/десериализацию для помещения двоичных данных в столбец базы данных. Еще - UID серийной версии нигде в базе не хранится.

Дополнительную информацию о постоянных полях (которые сохраняются, а какие нет) см. в главе 2.2 Постоянные поля и свойства в спецификация JPA 2.0 FR.

person Piotr Nowicki    schedule 12.12.2011
comment
Да, я посмотрел еще немного и тоже нашел ответ, но вы сделали его еще яснее. Единственное, что мне не хватает, это изменение DDL для класса, то есть определение класса, где это происходит, когда класс «повторно гидратируется» из базы данных в другой объект класса. Вероятно, следует задать это как отдельный вопрос. - person Dennis; 13.12.2011
comment
Итак, вам интересно, как поставщик JPA узнает, что класс был изменен между его персистентностью и чтением? Если ваша БД изменится, а ваша модель - нет, она будет неправильно отображена (или выдаст исключение). Если вы измените модель, но не измените базовое представление базы данных, она будет неправильно отображена. Вы можете только проверить, в порядке ли ваши сопоставления с функцией, специфичной для поставщика (т. Е. validate как значение свойства hibernate.hbm2ddl.auto в Hibernate, должно помочь) - person Piotr Nowicki; 13.12.2011

статические значения никогда не сериализуются, а JPA не использует сериализацию Java.

person jtahlborn    schedule 12.12.2011