如何让JPA在PostgreSQL中生成AS IDENTITY而非serial4的主键?
问题描述
我有如下Item实体类:
// ... 导入等代码 public class Item { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String title; private String description; // ... 更多代码 }
我期望生成的DDL中主键带有GENERATED ALWAYS AS IDENTITY:
CREATE TABLE public.items ( id int4 NOT NULL GENERATED ALWAYS AS IDENTITY( INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START 1 CACHE 1 NO CYCLE), title varchar(255) NULL, description varchar(255) NULL, CONSTRAINT items_pkey PRIMARY KEY (id) );
但实际生成的主键却是serial4类型:
CREATE TABLE public.items ( id serial4 NOT NULL, title varchar(255) NULL, description varchar(255) NULL, CONSTRAINT items_pkey PRIMARY KEY (id), CONSTRAINT items_user_id_key UNIQUE (user_id) );
我尝试过给id字段添加@Column(columnDefinition = "GENERATED ALWAYS AS IDENTITY")注解,也试过改用GenerationType.AUTO策略,但主键依然是serial4类型。请问如何强制JPA在PostgreSQL中生成GENERATED ALWAYS AS IDENTITY类型的主键?
解决方案
- 确保JPA实现版本兼容:PostgreSQL 10及以上版本支持标准的
GENERATED AS IDENTITY语法,需使用Hibernate 5.4+或对应新版Spring Data JPA,旧版本的JPA实现默认会用serial类型兼容低版本PostgreSQL。 - 调整实体类主键注解:在主键字段上同时指定
GenerationType.IDENTITY和明确的列定义,避免JPA实现忽略自定义配置:@Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(columnDefinition = "int4 GENERATED ALWAYS AS IDENTITY") private Integer id; - 配置JPA方言与生成器属性:在配置文件(如
application.properties)中指定支持IDENTITY的方言,并启用新的生成器映射规则:
其中spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQL10Dialect spring.jpa.properties.hibernate.id.new_generator_mappings=truePostgreSQL10Dialect会优先使用标准IDENTITY语法,new_generator_mappings=true会禁用旧的serial生成逻辑。 - 重新生成DDL:开发环境可设置
spring.jpa.hibernate.ddl-auto=create,删除已生成的旧表后重新创建,确保新的DDL语法生效。
内容的提问来源于stack exchange,提问作者João Hass
相关产品推荐
相关产品推荐

