Oracle 10 Dialect
Для Oracle10gDialect используйте эту конфигурацию
@Id
@Column(name = "MY_PRIMARY_KEY")
@GeneratedValue(strategy=GenerationType.AUTO)
Long myPrimaryKey;
Hibernate создает таблицу и последовательность:
create table MY_TABLE (
MY_PRIMARY_KEY number(19,0) not null,
VALUE varchar2(255 char),
primary key (MY_PRIMARY_KEY))
create sequence hibernate_sequence
Покапри его сохранении сначала получается новый идентификатор последовательности, а затем передается его в операторе INSERT
select hibernate_sequence.nextval from dual
insert into MY_TABLE (VALUE, MY_PRIMARY_KEY) values (?, ?)
Oracle 12 Dialect
Если вы используете Oracle 12 , который изначально поддерживаетIDENTITY column
предпочтительно обновить до Oracle12cDialect (обратите внимание, что для этого требуется Hibernate 5.3)
Установите для strategy
значение GenerationType.IDENTITY
@Id
@Column(name = "MY_PRIMARY_KEY", updatable = false, nullable = false)
@GeneratedValue(strategy=GenerationType.IDENTITY)
Long myPrimaryKey;
Создана следующая таблица - важная часть generated as identity
, которая предоставляет уникальные значения.Обратите внимание, что явный sequence
не требуется создавать, он управляется внутри.
create table MY_TABLE (
MY_PRIMARY_KEY number(19,0) generated as identity,
VALUE varchar2(255 char),
primary key (MY_PRIMARY_KEY))
При сохранении идентификатор не передается в INSERT , он присваивается Oracle и возвращаетсяк сеансу
insert into MY_TABLE (VALUE) values (?) RETURNING MY_PRIMARY_KEY INTO ?
Обратите внимание, что в отличие от Oracle 10 вы сохраняете одну поездку в базу данных.