Hibernate 5自定义序列在MariaDB 11中报错:未知列next_val
问题解决:Hibernate 5序列查询报错Unknown column 'next_val'
问题描述
使用Hibernate 5保存generation type为sequence的新实体时,Hibernate执行查询:
select next_val as id_val from my_sequence_table for update
抛出SQL异常:
Caused by:
java.sql.SQLException: Unknown column 'next_val' in 'field list'
已确认数据库中my_sequence_table存在,异常触发于自定义的SequenceStyleGenerator实现的generate方法,代码如下:
@Override public Serializable generate(final SharedSessionContractImplementor session, final Object object) throws HibernateException { TaxClaimReference claimReference = (TaxClaimReference) object; valuePrefix = claimReference.getRegisterReferencePrefix(); return valuePrefix + String.format(numberFormat, super.generate(session, object)); }
问题原因
Hibernate的SequenceStyleGenerator默认序列表的列名为next_val,但你的my_sequence_table实际列名并非这个,导致查询时找不到对应列。
解决方案
1. 确认序列表实际列名
先查看数据库中my_sequence_table的结构,确认存储序列值的列名(比如seq_value、current_val等)。
2. 通过实体注解指定列名
在实体类的ID字段上,通过@GenericGenerator的parameters配置序列表的列名参数:
@Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "tax_claim_seq") @GenericGenerator( name = "tax_claim_seq", strategy = "你的自定义SequenceStyleGenerator全类名", parameters = { @Parameter(name = "sequence_name", value = "my_sequence_table"), @Parameter(name = "column_name", value = "你的实际列名"), // 替换为真实列名 @Parameter(name = "initial_value", value = "1"), @Parameter(name = "increment_size", value = "1") } ) private String id;
3. 全局配置(可选)
如果多个实体都使用同一种序列表结构,可以在配置文件中全局设置列名:
- 若使用
application.properties:
hibernate.id.new_generator_mappings=true hibernate.sequence_style_generator.column_name=你的实际列名
- 若使用
hibernate.cfg.xml:
<property name="hibernate.id.new_generator_mappings">true</property> <property name="hibernate.sequence_style_generator.column_name">你的实际列名</property>
4. 验证自定义生成器逻辑
你的自定义generate方法仅做前缀拼接,未修改序列查询逻辑,所以只需确保上述配置正确即可,无需修改现有代码。
内容的提问来源于stack exchange,提问作者omarAhmed
相关产品推荐
相关产品推荐

