Hibernate @generatedvalue for HSQLDB

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?

9
задан Pascal Thivent 29 August 2010 в 22:34
поделиться

1 ответ

Не Стратегия генерации auto подразумевает, что провайдер (в данном случае спящий режим) автоматически выберет правильный подход и выполнит всю тяжелую работу по мере необходимости (создает последовательность, использует собственный подход или что-то еще, что работает для этой конкретной платформы)? Я правильно понимаю?

Теоретически это так (по умолчанию это IDENTITY с HSQLDB), и это работает для меня. В связи с этим возникают следующие вопросы:

  • Какой диалект вы используете (на всякий случай)?
  • Как вы создали таблицу?
  • Можете ли вы показать DDL (активировать ведение журнала org.hibernate. tool.hbm2ddl, если требуется)?
  • Как вставить (через API Hibernate, верно?)?

Вот пример 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.

11
ответ дан 4 December 2019 в 19:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: