Hibernate: hbm2ddl.auto = обновление и автоинкремент - PullRequest
3 голосов
/ 17 октября 2011

Если в таблице нет auto_increment, будет выдано исключение «org.hibernate.HibernateException: база данных не вернула нативно сгенерированное значение идентификатора», если я попытаюсь вставить что-то в таблицу. Идентификатор отображается так же, как:

    @Id @GeneratedValue
    private int id;

Хотя у меня есть hbm2ddl.auto = update. К сожалению, он не устанавливает AUTO_INCREMENT для таблицы назначения, путем проверки. Могу ли я достичь этого, без HQL и лучше без собственного SQL?

Ответы [ 2 ]

2 голосов
/ 15 января 2017

В PostgreSQL я нашел 2 способа сделать автоинкремент hbm2ddl.auto=create

1

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Integer id;

PostgreSQL генерирует PK как id serial not null, то есть уникальную последовательность для каждой таблицы

2

@Id
@Column(name = "id", unique = true, nullable = false, columnDefinition = "integer default nextval('hibernate_sequence')")
@GeneratedValue(strategy = GenerationType.SEQUENCE)
protected Integer id;

В этом случае с ФК произошло нечто странное:

create table meals (
    id integer default nextval('hibernate_sequence') not null,
    calories int4 not null,
    date_time timestamp not null,
    description varchar(255) not null,
    user_id integer default nextval('hibernate_sequence') not null,
    primary key (id)
)

В h2 автогенератор и автоинкремент работают нормально.

2 голосов
/ 17 октября 2011

Параметр hbm2ddl не имеет ничего общего с Identity GenerationType .

Вы можете написать свой собственный класс генератора идентификаторов / ключей и позволить hibernate знать свой собственный класс генератора ключей.Тогда hibernate получит личность от вашего собственного генератора.

некоторые статьи, которые вы можете посмотреть:

http://blog.anorakgirl.co.uk/?p=43

http://www.devx.com/Java/Article/30396/0/page/3

Hibernate ID Generator

для логики генерации идентификатора, это зависит от ваших требований.Самый простой способ - это max (id) +1, вы можете кэшировать max (id) для производительности.ну, вы должны позаботиться о проблеме безопасности потоков, а также о проблеме синхронизации кэша, если вы запускаете приложение в кластере env.

btw, с какой базой данных вы играете?

обновите

, откройте http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#mapping-declaration-id, и выполните поиск "5.1.2.2.1. Различные дополнительные генераторы", посмотрите и попробуйте тип генерации 'increment', если ваше приложение не работает в кластере.

...