Cic*_*chy 6 java postgresql hibernate sequence
我的实体类映射如下:
@Entity
@Audited
@Table(name="messages_locale")
public class Locale {
@Id
@GeneratedValue
@Getter @Setter //Project Lombok's annotations, equal to generated getter and setter method
private int id;
(...)
Run Code Online (Sandbox Code Playgroud)
我创建干净的新数据库和属性:
<prop key ="hibernate.hbm2ddl.auto">创建</ prop>
在创建数据库后,为什么地狱(对不起,差不多浪费了两天这个bug),我在postgres数据库中得到了一个序列?:
CREATE SEQUENCE hibernate_sequence
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 2
CACHE 1;
ALTER TABLE hibernate_sequence
OWNER TO postgres;
Run Code Online (Sandbox Code Playgroud)
我不想要一个序列,我想只是自动增加自动生成的值..
Pet*_*hev 21
在PostgreSQL中,使用SERIAL
伪类型处理自动增量.执行时使用此类型CREATE TABLE
.
现在到了这一点 - 这个SERIAL
伪类型创建了一个序列.PostgreSQL
使用创建的序列处理自动增量输入.该id
列的默认值为- nextval('your_sequence_name')
.
在Hibernate中User
实体:
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "users_seq_gen")
@SequenceGenerator(name = "users_seq_gen", sequenceName = "users_id_seq")
public Long getId() {
return id;
}
Run Code Online (Sandbox Code Playgroud)
在这里阅读:
http://www.postgresql.org/docs/8.4/static/datatype-numeric.html#DATATYPE-SERIAL
http://www.neilconway.org/docs/sequences/
Mic*_*fel 17
我认为Petar接受的答案不正确,或者不再正确.Postgres中的自动增量是通过SERIAL
伪类型处理的,这是正确的.但是,Petar给出的映射将导致Hibernate 5.1生成以下DDL:
CREATE SEQUENCE users_id_seq START 1 INCREMENT 50;
CREATE TABLE … (
id INT8 NOT NULL,
…
);
Run Code Online (Sandbox Code Playgroud)
这不是使用SERIAL
,而是Hibernate管理的序列.它不归表所有,也没有设置默认值.当然,DDL生成是许多人在生产中不使用的功能(但许多人将生成的代码作为模板).
如果手动编写DDL并实际使用SERIAL
,则使用GenerationType.SEQUENCE
甚至可能与数据库行为冲突.使用Postgres的首选ID策略映射Hibernate的正确方法是使用GenerationType.IDENTITY
.顺便提一下,代码也更短,更易读:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
23144 次 |
最近记录: |