JPA/Hibernate + PostgreSQL 환경에서 Entity ID 자동 생성
들어가며
JPA/HIbernate를 이용해서 Entity를 정의할 때, DB에서 Primary Key로 사용될 Field도 여기서 정의한다.Primary Key로는 이름이나 일련 번호와 같이 의미가 있는 값을 사용할 수 있지만, 자동으로 생성되는 값을 이용할 수도 있다. 이를 'JPA 자동키 생성', 'JPA 기본키 자동생성' 등으로 부르고 있으며, 여기에 그 내용을 잘 정리해 놓았으니 참고하면 좋을 것 같다. JPA/Hibernate에서 제공하는 자동 키 생성 전략에 대해서 저 Posting에서 거의 모두 설명하고 있는데, 다만 MySQL을 예로 사용하고 있어서 여기서는 PostgreSQL을 이용했을 때 어떻게 동작하는 지를 정리해 보았다.
Case 1. Primary Key를 UUID로 사용하는 경우
아래와 같이 간단한 Entity를 만들고 UUID type을 사용하는 property에 @Id를 적용하였다.
@NoArgsConstructor
@Entity
@Getter @Setter
public class IdTest implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private UUID id;
private String name;
private String description;
}
실행 시 Hibernate에서 만들어지는 Log를 확인하면, id field가 uuid type으로 생성되고, Primary Key로 설정됨을 확인할 수 있다.
...
[15:19:05.657][INFO ][main / BasicTypeRegistry ] HHH000270: Type registration [java.util.UUID] overrides previous : org.hibernate.type.UUIDBinaryType@40c2ce52
Hibernate:
create table id_test (
id uuid not null,
name varchar(255),
description varchar(255),
primary key (id)
)
[15:19:06.183][INFO ][main / SchemaCreatorImpl ] HHH000476: Executing import script 'org.hibernate.tool.schema.internal.exec.ScriptSourceInputNonExistentImpl@5cff729b'
...
Event를 발생시켜 하나의 row를 INSERT 시켰더니, id coulmn에 자동 생성된 '26191162-8177-4f07-8e4e-e9e5d474078a' 값이 입력되고 있음을 확인할 수 있다.
...
2019-06-18 15:22:15 KST [20601]: [22-1] LOG: duration: 0.033 ms parse <unnamed>: BEGIN
2019-06-18 15:22:15 KST [20601]: [23-1] LOG: duration: 0.004 ms bind <unnamed>: BEGIN
2019-06-18 15:22:15 KST [20601]: [24-1] LOG: duration: 0.017 ms execute <unnamed>: BEGIN
2019-06-18 15:22:15 KST [20601]: [25-1] LOG: duration: 0.149 ms parse <unnamed>: insert into id_test (name, description, id) values ($1, $2, $3)
2019-06-18 15:22:15 KST [20601]: [26-1] LOG: duration: 0.079 ms bind <unnamed>: insert into id_test (name, description, id) values ($1, $2, $3)
2019-06-18 15:22:15 KST [20601]: [27-1] DETAIL: parameters: $1 = 'string', $2 = 'string', $3 = '26191162-8177-4f07-8e4e-e9e5d474078a'
2019-06-18 15:22:15 KST [20601]: [28-1] LOG: duration: 0.254 ms execute <unnamed>: insert into id_test (name, description, id) values ($1, $2, $3)
2019-06-18 15:22:15 KST [20601]: [29-1] DETAIL: parameters: $1 = 'string', $2 = 'string', $3 = '26191162-8177-4f07-8e4e-e9e5d474078a'
2019-06-18 15:22:15 KST [20601]: [30-1] LOG: duration: 0.029 ms parse S_1: COMMIT
2019-06-18 15:22:15 KST [20601]: [31-1] LOG: duration: 0.005 ms bind S_1: COMMIT
2019-06-18 15:22:15 KST [20601]: [32-1] LOG: duration: 108.806 ms execute S_1: COMMIT
...
Case 2. @GeneratedValue annotation 사용
@GeneratedValue annotation은 특정 Field의 값을 자동으로 생성해주며, Primary Key를 자동 생성시에 많이 사용된다. 자동으로 생성하는 전략은 AUTO, IDENTITY, SEQUENCE, TABLE 4가지 중에 하나로 가져갈 수 있고, AUTO는 나머지 3가지 방법 중에 하나로 Mapping 된다. (Hibernate Version에 따라 AUTO가 Mapping 되는 방법이 달라지니 버젼을 변경해서 사용할 경우 주의해야 한다.) 그리고 아래 4개 환경은 모두 spring.jpa.hibernate.id.new_generator_mappings값을 true 로 설정하였다.
Case 2-1. @GeneratedValue(GenerationType.AUTO) 적용
위의 Entity에서 id field에 @GenerateValue annotation을 아래와 같이 추가한다.
...
@Id
@GeneratedValue(GenerationType.AUTO)
private long id;
...
실행 후 Hibernate가 생성한 Log를 확인하면 제일 먼저 1부터 시작해 1씩 증가하는 hibernate_sequence 라는 sequence를 만들고, id field를 int8 type으로 만들고 Primary Key로 설정한다.
...
[18:56:17.109][INFO ][main / BasicTypeRegistry ] HHH000270: Type registration [java.util.UUID] overrides previous : org.hibernate.type.UUIDBinaryType@40ac6b76
Hibernate:
drop table if exists id_test cascade
Hibernate:
drop sequence if exists hibernate_sequence
Hibernate: create sequence hibernate_sequence start 1 increment 1
Hibernate:
create table id_test (
id int8 not null,
name varchar(255),
description varchar(255),
primary key (id)
)
[18:56:17.656][INFO ][main / SchemaCreatorImpl ] HHH000476: Executing import script 'org.hibernate.tool.schema.internal.exec.ScriptSourceInputNonExistentImpl@5b48f0f4'
Data source로 사용하는 PostgreSQL DB에 접속해서 Sequence List를 확인하면 hibernate_sequence라는 Sequence가 만들어진 것을 확인할 수 있다.
...
testdb=# SELECT sequence_name FROM information_schema.sequences;
sequence_name
--------------------
hibernate_sequence
(1 row)
...
역시 위와 같이 하나의 Record를 추가시키고 DB에서 만들어지는 Log를 확인하면, Insert 구문이 실행되기 전에 hibernate_sequence에 'nextval' function을 실행하고 여기서 구해진 값을 id_test Table의 id column의 인자로 사용해서 Insert를 실행한다.
...
2019-06-17 19:53:09 KST [2165]: [35-1] LOG: duration: 0.015 ms parse <unnamed>: BEGIN
2019-06-17 19:53:09 KST [2165]: [36-1] LOG: duration: 0.003 ms bind <unnamed>: BEGIN
2019-06-17 19:53:09 KST [2165]: [37-1] LOG: execute <unnamed>: BEGIN
2019-06-17 19:53:09 KST [2165]: [38-1] LOG: duration: 0.006 ms
2019-06-17 19:53:09 KST [2165]: [39-1] LOG: duration: 0.180 ms parse <unnamed>: select nextval ('hibernate_sequence')
2019-06-17 19:53:09 KST [2165]: [40-1] LOG: duration: 0.077 ms bind <unnamed>: select nextval ('hibernate_sequence')
2019-06-17 19:53:09 KST [2165]: [41-1] LOG: execute <unnamed>: select nextval ('hibernate_sequence')
2019-06-17 19:53:09 KST [2165]: [42-1] LOG: duration: 0.076 ms
2019-06-17 19:53:09 KST [2165]: [43-1] LOG: duration: 0.124 ms parse <unnamed>: insert into id_test (name, description, id) values ($1, $2, $3)
2019-06-17 19:53:09 KST [2165]: [44-1] LOG: duration: 0.054 ms bind <unnamed>: insert into id_test (name, description, id) values ($1, $2, $3)
2019-06-17 19:53:09 KST [2165]: [45-1] DETAIL: parameters: $1 = 'task1', $2 = 'hard work', $3 = '1'
2019-06-17 19:53:09 KST [2165]: [46-1] LOG: execute <unnamed>: insert into insert into id_test (name, description, id) values ($1, $2, $3)
2019-06-17 19:53:09 KST [2165]: [47-1] DETAIL: parameters: $1 = 'task1', $2 = 'hard work', $3 = '1'
2019-06-17 19:53:09 KST [2165]: [48-1] LOG: duration: 0.296 ms
2019-06-17 19:53:09 KST [2165]: [49-1] LOG: duration: 0.028 ms parse S_1: COMMIT
2019-06-17 19:53:09 KST [2165]: [50-1] LOG: duration: 0.006 ms bind S_1: COMMIT
2019-06-17 19:53:09 KST [2165]: [51-1] LOG: execute S_1: COMMIT
2019-06-17 19:53:09 KST [2165]: [52-1] LOG: duration: 100.051 ms
...
Case 2-2. @GeneratedValue(GenerationType.IDENTITY) 적용
id field에 적용한 annotation 값을 변경 한다.
...
@Id
@GeneratedValue(GenerationType.IDENTITY)
private long id;
...
실행 후 Hibernate가 생성한 Log를 확인하면 아래와 같이 id type이 bigserial로 생성되는 것을 확인할 수 있다.
...
[19:16:36.421][INFO ][main / BasicTypeRegistry ] HHH000270: Type registration [java.util.UUID] overrides previous : org.hibernate.type.UUIDBinaryType@73a0f2b
Hibernate:
drop table if exists id_test cascade
Hibernate:
create table id_test (
id bigserial not null,
name varchar(255),
description varchar(255),
primary key (id)
)
[19:16:36.872][INFO ][main / SchemaCreatorImpl ] HHH000476: Executing import script 'org.hibernate.tool.schema.internal.exec.ScriptSourceInputNonExistentImpl@1332dec4'
...
PostgreSQL에서는 Serial type을 위해 DB 자체적으로 Sequence를 만든다. Table이 만들어 진 후 Data Source에 접속해서 Sequence List를 조회해보면 이 사실을 확인할 수 있다. 아래와 같이 id_test_id_seq 라는 이름으로 sequence가 생성되어있다. (PostgreSQL에서 Serial type에 대해 자동으로 만들어 주는 sequence name 형식은 {tablename}_{columnname}_seq 이다.)
...
testdb=# SELECT sequence_schema, sequence_name FROM information_schema.sequences;
sequence_schema | sequence_name
-----------------+-------------------------
public | id_test_id_seq
(1 rows)
...
Insert로 하나의 Record를 추가할 때 실행 과정을 보면 GenerationType.AUTO의 경우와 약간 다르게 동작하는 것을 확인할 수 있다. id 값이 Insert 문에 포함되지 않고, 'select currval('hibernate_sequence')'문이 Insert 문 뒤에서 실행된다. 그리고 이 두 query가 한 Transaction에 묶여있다. 이와 같이 PostgreSQL은 Serial type으로 선언된 field를 자동으로 관리한다.
...
2019-06-17 19:47:07 KST [2055]: [29-1] LOG: duration: 0.014 ms parse <unnamed>: BEGIN
2019-06-17 19:47:07 KST [2055]: [30-1] LOG: duration: 0.004 ms bind <unnamed>: BEGIN
2019-06-17 19:47:07 KST [2055]: [31-1] LOG: execute <unnamed>: BEGIN
2019-06-17 19:47:07 KST [2055]: [32-1] LOG: duration: 0.020 ms
2019-06-17 19:47:07 KST [2055]: [33-1] LOG: duration: 0.169 ms parse <unnamed>: insert into id_test (name, description) values ($1, $2)
2019-06-17 19:47:07 KST [2055]: [34-1] LOG: duration: 0.064 ms bind <unnamed>: insert into id_test (name, description) values ($1, $2)
2019-06-17 19:47:07 KST [2055]: [35-1] DETAIL: parameters: $1 = 'task1', $2 = 'hard work'
2019-06-17 19:47:07 KST [2055]: [36-1] LOG: execute <unnamed>: insert into id_test (name, description) values ($1, $2)
2019-06-17 19:47:07 KST [2055]: [37-1] DETAIL: parameters: $1 = 'task1', $2 = 'hard work'
2019-06-17 19:47:07 KST [2055]: [38-1] LOG: duration: 0.332 ms
2019-06-17 19:47:07 KST [2055]: [39-1] LOG: duration: 0.087 ms parse <unnamed>: select currval('id_test_id_seq')
2019-06-17 19:47:07 KST [2055]: [40-1] LOG: duration: 0.032 ms bind <unnamed>: select currval('id_test_id_seq')
2019-06-17 19:47:07 KST [2055]: [41-1] LOG: execute <unnamed>: select currval('id_test_id_seq')
2019-06-17 19:47:07 KST [2055]: [42-1] LOG: duration: 0.009 ms
2019-06-17 19:47:07 KST [2055]: [43-1] LOG: duration: 0.030 ms parse S_1: COMMIT
2019-06-17 19:47:07 KST [2055]: [44-1] LOG: duration: 0.008 ms bind S_1: COMMIT
2019-06-17 19:47:07 KST [2055]: [45-1] LOG: execute S_1: COMMIT
2019-06-17 19:47:07 KST [2055]: [46-1] LOG: duration: 103.773 ms
...
Case 2-3. @GeneratedValue(GenerationType.SEQUENCE) 적용
GenerationType.SEQUENCE는 GenerationType.AUTO와 동일하게 동작한다. (GenerationType.AUTO 설정이 GenerationType.SEQUENCE로 Mapping 되는 것으로 보여진다.) 이 사실은 Hibernate Log, PostgreSQL DB Log와 생성된 Sequence List를 확인하면 확실하게 알 수 있다.
...
[19:39:56.255][INFO ][main / BasicTypeRegistry ] HHH000270: Type registration [java.util.UUID] overrides previous : org.hibernate.type.UUIDBinaryType@6274670b
Hibernate: create sequence hibernate_sequence start 1 increment 1
Hibernate:
create table id_test (
id int8 not null,
name varchar(255),
description varchar(255),
primary key (id)
)
[19:39:56.787][INFO ][main / SchemaCreatorImpl ] HHH000476: Executing import script 'org.hibernate.tool.schema.internal.exec.ScriptSourceInputNonExistentImpl@1b8aaeab'
...
...
2019-06-17 19:43:08 KST [1942]: [37-1] LOG: execute <unnamed>: BEGIN
2019-06-17 19:43:08 KST [1942]: [38-1] LOG: duration: 0.007 ms
2019-06-17 19:43:08 KST [1942]: [39-1] LOG: duration: 0.281 ms parse <unnamed>: select nextval ('hibernate_sequence')
2019-06-17 19:43:08 KST [1942]: [40-1] LOG: duration: 0.067 ms bind <unnamed>: select nextval ('hibernate_sequence')
2019-06-17 19:43:08 KST [1942]: [41-1] LOG: execute <unnamed>: select nextval ('hibernate_sequence')
2019-06-17 19:43:08 KST [1942]: [42-1] LOG: duration: 0.041 ms
2019-06-17 19:43:08 KST [1942]: [43-1] LOG: duration: 0.093 ms parse <unnamed>: insert into id_test (name, description, id) values ($1, $2, $3)
2019-06-17 19:43:08 KST [1942]: [44-1] LOG: duration: 0.064 ms bind <unnamed>: insert into id_test (name, description, id) values ($1, $2, $3)
2019-06-17 19:43:08 KST [1942]: [45-1] DETAIL: parameters: $1 = 'task1', $2 = 'hard work', $3 = '1'
2019-06-17 19:43:08 KST [1942]: [46-1] LOG: execute <unnamed>: insert into id_test (name, description, id) values ($1, $2, $3)
2019-06-17 19:43:08 KST [1942]: [47-1] DETAIL: parameters: $1 = 'task1', $2 = 'hard work', $3 = '1'
2019-06-17 19:43:08 KST [1942]: [48-1] LOG: duration: 0.205 ms
2019-06-17 19:43:08 KST [1942]: [49-1] LOG: duration: 0.032 ms parse S_1: COMMIT
2019-06-17 19:43:08 KST [1942]: [50-1] LOG: duration: 0.005 ms bind S_1: COMMIT
2019-06-17 19:43:08 KST [1942]: [51-1] LOG: execute S_1: COMMIT
2019-06-17 19:43:08 KST [1942]: [52-1] LOG: duration: 95.836 ms
...
생성된 Sequence도 GenerationType.AUTO인 경우와 동일하다.
...
testdb=# SELECT sequence_name FROM information_schema.sequences;
sequence_name
--------------------
hibernate_sequence
(1 row)
Case 2-4. @GeneratedValue(GenerationType.TABLE) 적용
아래와 같이 @GenerationType.TABLE으로 설정한다.
...
@Id
@GeneratedValue(GenerationType.TABLE)
private long id;
...
Project를 실행한 후에 Hibernate Log를 확인하면 Sequence를 관리하는 별도의 Table이 생성되는 것을 확인할 수 있다. (Table 명은 hibernate_sequences 이다.)
...
[19:55:19.749][INFO ][main / BasicTypeRegistry ] HHH000270: Type registration [java.util.UUID] overrides previous : org.hibernate.type.UUIDBinaryType@79696332
[19:55:19.798][INFO ][main / TableGenerator ] HHH000398: Explicit segment value for id generator [hibernate_sequences.sequence_name] suggested; using default [default]
Hibernate:
create table id_test (
id int8 not null,
name varchar(255),
description varchar(255),
primary key (id)
)
Hibernate:
create table hibernate_sequences (
sequence_name varchar(255) not null,
next_val int8,
primary key (sequence_name)
)
Hibernate:
[19:55:20.222][INFO ][main / SchemaCreatorImpl ] HHH000476: Executing import script 'org.hibernate.tool.schema.internal.exec.ScriptSourceInputNonExistentImpl@234cd86c'
...
id_test Table에 하나의 Record를 Insert했을 때의 내부 동작을 ibernate Log와 DB Log를 통해 확인하면 Hibernate는 sequence table에 있는 next_val field의 값을 얻고, 이 값을 증가 시킨 후에, 실제 Record를 하나 추가하고 이 때 next_val field에서 얻어진 값을 id로 입력시킨다.
...
Hibernate:
select
tbl.next_val
from
hibernate_sequences tbl
where
tbl.sequence_name=? for update
of tbl
Hibernate:
update
hibernate_sequences
set
next_val=?
where
next_val=?
and sequence_name=?
Hibernate:
insert
into
id_test
(name, description, id)
values
(?, ?, ?)
...
...
2019-06-17 19:57:40 KST [2239]: [13-1] LOG: duration: 0.015 ms parse <unnamed>: BEGIN
2019-06-17 19:57:40 KST [2239]: [14-1] LOG: duration: 0.004 ms bind <unnamed>: BEGIN
2019-06-17 19:57:40 KST [2239]: [15-1] LOG: execute <unnamed>: BEGIN
2019-06-17 19:57:40 KST [2239]: [16-1] LOG: duration: 0.006 ms
2019-06-17 19:57:40 KST [2239]: [17-1] LOG: duration: 0.632 ms parse <unnamed>: select tbl.next_val from hibernate_sequences tbl where tbl.sequence_name=$1 for update of tbl
2019-06-17 19:57:40 KST [2239]: [18-1] LOG: duration: 0.302 ms bind <unnamed>: select tbl.next_val from hibernate_sequences tbl where tbl.sequence_name=$1 for update of tbl
2019-06-17 19:57:40 KST [2239]: [19-1] DETAIL: parameters: $1 = 'default'
2019-06-17 19:57:40 KST [2239]: [20-1] LOG: execute <unnamed>: select tbl.next_val from hibernate_sequences tbl where tbl.sequence_name=$1 for update of tbl
2019-06-17 19:57:40 KST [2239]: [21-1] DETAIL: parameters: $1 = 'default'
2019-06-17 19:57:40 KST [2239]: [22-1] LOG: duration: 0.095 ms
2019-06-17 19:57:40 KST [2239]: [23-1] LOG: duration: 0.106 ms parse <unnamed>: update hibernate_sequences set next_val=$1 where next_val=$2 and sequence_name=$3
2019-06-17 19:57:40 KST [2239]: [24-1] LOG: duration: 0.098 ms bind <unnamed>: update hibernate_sequences set next_val=$1 where next_val=$2 and sequence_name=$3
2019-06-17 19:57:40 KST [2239]: [25-1] DETAIL: parameters: $1 = '1', $2 = '0', $3 = 'default'
2019-06-17 19:57:40 KST [2239]: [26-1] LOG: execute <unnamed>: update hibernate_sequences set next_val=$1 where next_val=$2 and sequence_name=$3
2019-06-17 19:57:40 KST [2239]: [27-1] DETAIL: parameters: $1 = '1', $2 = '0', $3 = 'default'
2019-06-17 19:57:40 KST [2239]: [28-1] LOG: duration: 0.053 ms
2019-06-17 19:57:40 KST [2239]: [29-1] LOG: duration: 0.009 ms parse S_1: COMMIT
2019-06-17 19:57:40 KST [2239]: [30-1] LOG: duration: 0.003 ms bind S_1: COMMIT
2019-06-17 19:57:40 KST [2239]: [31-1] LOG: execute S_1: COMMIT
2019-06-17 19:57:40 KST [2239]: [32-1] LOG: duration: 116.319 ms
2019-06-17 19:57:40 KST [2238]: [41-1] LOG: duration: 0.016 ms parse <unnamed>: BEGIN
2019-06-17 19:57:40 KST [2238]: [42-1] LOG: duration: 0.005 ms bind <unnamed>: BEGIN
2019-06-17 19:57:40 KST [2238]: [43-1] LOG: execute <unnamed>: BEGIN
2019-06-17 19:57:40 KST [2238]: [44-1] LOG: duration: 0.021 ms
2019-06-17 19:57:40 KST [2238]: [45-1] LOG: duration: 0.119 ms parse <unnamed>: insert into id_test (name, description, id) values ($1, $2, $3)
2019-06-17 19:57:40 KST [2238]: [46-1] LOG: duration: 0.089 ms bind <unnamed>: insert into id_test (name, description, id) values ($1, $2, $3)
2019-06-17 19:57:40 KST [2238]: [47-1] DETAIL: parameters: $1 = 'task1', $2 = 'hard work', $3 = '1'
2019-06-17 19:57:40 KST [2238]: [48-1] LOG: execute <unnamed>: insert into id_test (name, description, id) values ($1, $2, $3)
2019-06-17 19:57:40 KST [2238]: [49-1] DETAIL: parameters: $1 = 'task1', $2 = 'hard work', $3 = '1'
2019-06-17 19:57:40 KST [2238]: [50-1] LOG: duration: 0.237 ms
2019-06-17 19:57:40 KST [2238]: [51-1] LOG: duration: 0.016 ms parse S_1: COMMIT
2019-06-17 19:57:40 KST [2238]: [52-1] LOG: duration: 0.005 ms bind S_1: COMMIT
2019-06-17 19:57:40 KST [2238]: [53-1] LOG: execute S_1: COMMIT
2019-06-17 19:57:40 KST [2238]: [54-1] LOG: duration: 14.094 ms
...
그리고 Sequence 관리를 Table을 통해 하기 떄문에 당연히 Sequence List에서는 조회되지 않고 Table list로만 조회된다.
...
testdb=# SELECT sequence_name FROM information_schema.sequences;
sequence_name
---------------
(0 rows)
testdb=# SELECT * FROM pg_tables WHERE tableowner='browndwarf';
schemaname | tablename | tableowner | tablespace | hasindexes | hasrules | hastriggers | rowsecurity
------------+---------------------+------------+------------+------------+----------+-------------+-------------
public | id_test | browndwarf | | t | f | f | f
public | hibernate_sequences | browndwarf | | t | f | f | f
(2 rows)
...
Case 3. use-new-id-generator-mappings= false 설정할 경우
프로젝트 설정값 중에서 spring.jpa.hibernate.use-new-id-generator-mappings property의 값이 false로 설정되면, 자동키 생성을 담당하는 class가 org.hibernate.id.enhanced.SequenceStyleGenerator 대신 org.hibernate.id.SequenceGenerator가 사용된다. 단, SequenceStyleGenerator는 Database에서 Sequence를 지원하지 않는 경우(ex. MSSQL 2012 이전 버전)에 대응전략이 강화된 Class라, Sequence를 지원하는 PostgreSQL에서는 별다른 차이 없이 동작하는 것으로 보여진다.
...
spring:
jpa:
hibernate:
use-new-id-generator-mappings= false
...
이후 동작하는 과정을 확인해 보면 이전과 동일함을 확인할 수 있다.
...
[14:59:04.468][INFO ][main / BasicTypeRegistry ] HHH000270: Type registration [java.util.UUID] overrides previous : org.hibernate.type.UUIDBinaryType@1d858300
[14:59:04.517][WARN ][main / deprecation ] HHH90000014: Found use of deprecated [org.hibernate.id.SequenceGenerator] sequence-based id generator; use org.hibernate.id.enhanced.SequenceStyleGenerator instead. See Hibernate Domain Model Mapping Guide for details.
Hibernate: create sequence hibernate_sequence start 1 increment 1
Hibernate:
create table id_test (
id int8 not null,
name varchar(255),
description varchar(255),
primary key (id)
)
[14:59:04.993][INFO ][main / SchemaCreatorImpl ] HHH000476: Executing import script 'org.hibernate.tool.schema.internal.exec.ScriptSourceInputNonExistentImpl@2726a511'
...
testdb=# SELECT sequence_name FROM information_schema.sequences;
sequence_name
--------------------
hibernate_sequence
(1 row)
Reference