首页 > 解决方案 > Hibernate 自定义序列生成器 - 表不存在

问题描述

我正在使用自定义类来生成 id:

public class StringPrefixedSequenceIdGenerator extends SequenceStyleGenerator

还在实体属性上使用此类:

@Id
    @GenericGenerator(name = "pipeline_seq_generator", strategy = "com.model.StringPrefixedSequenceIdGenerator", parameters = {
            @Parameter(name = StringPrefixedSequenceIdGenerator.INCREMENT_PARAM, value = "50") })
    @GeneratedValue(generator = "pipeline_seq_generator", strategy = GenerationType.SEQUENCE)
    @Column(name = "pipeline_id", unique = true, nullable = false, length = 100)
    public String getPipelineId() {
        return this.pipelineId;
    }

问题是hibernate仍然尝试从数据库中获取序列:
select next_val as id_val from pipeline_seq_generator for update

错误:java.sql.SQLSyntaxErrorException:表 'table.pipeline_seq_generator' 不存在

编辑:当我在我的方法中将 super.generate(session,object) 作为参数传递时,@Override generate 方法导致休眠从数据库调用序列:

@Override
    public Serializable generate(SharedSessionContractImplementor session,
            Object object) throws HibernateException {
        return String.format(format, LocalDate.now(), super.generate(session, object));
    }

标签: spring-bootjava-8hibernate-5.x

解决方案


我将 generate 方法的实现更改为不使用 super.generate(session, object):

@Override
    public Serializable generate(SharedSessionContractImplementor session,
            Object object) throws HibernateException {
        LocalTime localTime = LocalTime.now();
        return prefix + String.format(format, LocalDate.now()) + localTime.getHour() + localTime.getMinute() + localTime.getSecond();
    }

在这个模型中,我只使用我的实现而不使用序列数据库。


推荐阅读