首页 > 解决方案 > 我正在尝试使用 H2 内存数据库和自定义 @GenericGenerator 策略,但在内部我的 customeId 生成器没有被调用

问题描述

我正在使用 H2 数据库创建一个 Spring Boot 应用程序,并且我想customId使用一些前缀创建一个生成器,但它没有被创建。

正如我FilmsIdGenerator通过如下扩展创建的SequenceStyleGenerator。但是在为主要列生成值时,不会调用自定义生成器show_id。它没有附加我提到的前缀,例如 B_00001 理想情况下应该是为主键创建的格式,show_id但它正在创建默认的 s1,s2 ... 任何人都可以帮忙

public class FilmsIdGenerator extends SequenceStyleGenerator {
    
    public static final String VALUE_PREFIX_PARAMETER = "valuePrefix";
    public static final String VALUE_PREFIX_DEFAULT = "";
    private String valuePrefix;
    
    public static final String NUMBER_FORMAT_PARAMETER = "numberFormat";
    public static final String NUMBER_FORMAT_DEFAULT = "%d";
    private String numberFormat;
    
    @Override
    public Serializable generate(SharedSessionContractImplementor session,
            Object object) throws HibernateException {
        return valuePrefix + String.format(numberFormat, super.generate(session, object));
    }
    
    @Override
    public void configure(Type type, Properties params,
            ServiceRegistry serviceRegistry) throws MappingException {
        super.configure(LongType.INSTANCE, params, serviceRegistry);
        valuePrefix = ConfigurationHelper.getString(VALUE_PREFIX_PARAMETER,
                params, VALUE_PREFIX_DEFAULT);
        numberFormat = ConfigurationHelper.getString(NUMBER_FORMAT_PARAMETER,
                params, NUMBER_FORMAT_DEFAULT);
    }
}

上面给出的是我的自定义 id 生成器类,它应该创建 B_00001 格式的主键 id。但它采用默认序列格式,即 s1、s2、.. 等我使用的是 H2 数据库。谁能告诉我为什么没有在我的主键上调用自定义生成器 JPA 正在为持久性生成主键 ID?

下面给出的是实体类,我将 customidgenerator 作为策略和 3 个输入参数传递,我需要生成格式为 B_00001 的主键,但它正在生成 s1、s2、.. 即它采用默认序列格式。为什么我的自定义 id 生成器没有被应用到它。

因为我通过如下实现 SequenceStyleGenerator 创建了 customIdgenerator,但是在生成主列 show_id 时没有调用自定义生成器。它没有附加我提到的前缀,如 B_00001 理想情况下应该是为主键 show_id 创建的格式,但它是创建定义

@Table(name = "FILMS") 
public class Films implements Serializable, Comparator {
    
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "film_seq")
    @GenericGenerator(name = "film_seq", strategy = "com.films.demo.model.generator.FilmsIdGenerator", parameters = {
            @Parameter(name = FilmsIdGenerator.INCREMENT_PARAM, value = "50"),
            @Parameter(name = FilmsIdGenerator.VALUE_PREFIX_PARAMETER, value = "B_"),
            @Parameter(name = FilmsIdGenerator.NUMBER_FORMAT_PARAMETER, value = "%05d") })
    @Column(name = "show_id")
    private String show_id;

标签: javaspring-boothibernatejpah2

解决方案


我已经将它与 db2 数据库一起使用。它正在生成具有正确前缀的正确 show_id。这个问题似乎只存在于内存数据库中的 h2


推荐阅读