I have the following definition for an id field in an entity that is mapped to a table in HSQLDB.
...
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name = "ID")
private Integer id;
...
But this does not seem to generate the an unique id; instead an attempt is made to insert null into the column which results in failure. If, I manually create a sequence and generation strategy to use that sequence then the data is persisted as expected.
Doesn't a generation strategy of auto imply that the provider (hibernate in this case) will automatically choose the correct approach and do all the heavy lifting as needed (create sequence, use a native approach or whatever works for that particular platform)? Is my understanding incorrect?
Не Стратегия генерации auto подразумевает, что провайдер (в данном случае спящий режим) автоматически выберет правильный подход и выполнит всю тяжелую работу по мере необходимости (создает последовательность, использует собственный подход или что-то еще, что работает для этой конкретной платформы)? Я правильно понимаю?
Теоретически это так (по умолчанию это IDENTITY с HSQLDB), и это работает для меня. В связи с этим возникают следующие вопросы:
org.hibernate. tool.hbm2ddl
, если требуется)?Вот пример DDL для сущности Foo
при использовании HSQLDB:
create table Foo (
id bigint generated by default as identity (start with 1),
bar varchar(100),
primary key (id)
)
Я создал таблицу с помощью диспетчера БД HSQL. Просто обычный адрес таблицы создания... В моем случае я не устанавливал столбец id как идентификатор - просто установил его как первичный ключ.
Тогда у вас есть ответ, используйте столбец IDENTITY
.
Хотя Hibernate выбирает правильную стратегию и генерирует соответствующие операторы INSERT
(передавая null
в идентификатор, который, как ожидается, будет сохранен в IDENTITY
столбец), он не создаст и не изменит вашу физическую модель, если вы не используете возможности генерации и экспорта DDL.