使用JPA @TableGenerator生成错误SQL的原因排查求助
问题解决:@TableGenerator 提示 "seq_name" 列不存在
问题原因
你遇到的错误核心是:@TableGenerator注解默认使用SEQ_NAME作为主键列名,但你的自定义序列表id_generation里的主键列是gen_name。你只指定了pkColumnValue(对应列的取值),却没有显式声明pkColumnName(对应列的名称),导致EclipseLink生成的SQL依然用默认的SEQ_NAME去匹配,自然找不到对应列。
修正代码
修改实体类中的@TableGenerator注解,添加pkColumnName="gen_name"属性,明确指定主键列的名称,同时调整pkColumnValue为当前生成器的唯一标识值(避免和其他生成器冲突):
@Id @Column(name="userRoleID") @TableGenerator(name = "role_generation", table = "id_generation", pkColumnName = "gen_name", // 新增:指定序列表的主键列名 pkColumnValue = "role_gen", // 修改为该生成器的唯一标识,比如角色表专用标识 valueColumnName = "gen_val") @GeneratedValue(generator = "role_generation") private long userRoleID;
关键参数说明
pkColumnName:序列表中存储生成器名称的列名(你的表中是gen_name)pkColumnValue:当前生成器在序列表中的唯一取值,比如角色表生成器用role_gen,用户表生成器用user_gen,用于区分不同模块的主键生成- 你的手动建表语句无需修改,保持如下即可:
CREATE TABLE id_generation(gen_name varchar(80), gen_val INTEGER, CONSTRAINT pk_id_generation primary key(gen_name));
配置优化建议
如果你已经手动创建了序列表,建议调整persistence.xml中的DDL配置,避免框架自动生成表结构造成冲突:
<properties> <property name="eclipselink.logging.level" value="FINE"/> <property name="eclipselink.target-database" value="PostgreSQL"/> <property name="eclipselink.ddl-generation" value="none"/> <property name="jakarta.persistence.schema-generation.database.action" value="none"/> </properties>
内容的提问来源于stack exchange,提问作者Damien Cooke
相关产品推荐
相关产品推荐

