【问题标题】:Is there a way to create String sequence using @GeneratedValue with prefix?有没有办法使用带有前缀的@GeneratedValue 创建字符串序列?
【发布时间】:2019-08-30 10:26:00
【问题描述】:

我想创建一个前缀为“CID_00001”的序列(示例):

@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE)   
private String id;

有什么办法吗?

【问题讨论】:

标签: java hibernate spring-boot


【解决方案1】:

您可以使用custom id generator 来做到这一点。

最简单的方法是扩展Hibernate的SequenceStyleGenerator,实现对数据库序列的访问(包括一些有趣的优化)

public class StringPrefixedSequenceIdGenerator 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 生成器后,您可以在 @GenericGenerator 注释中引用它。

@Entity
public class Book {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "book_seq")
    @GenericGenerator(
        name = "book_seq", 
        strategy = "org.thoughts.on.java.generators.StringPrefixedSequenceIdGenerator", 
        parameters = {
            @Parameter(name = StringPrefixedSequenceIdGenerator.INCREMENT_PARAM, value = "50"),
            @Parameter(name = StringPrefixedSequenceIdGenerator.VALUE_PREFIX_PARAMETER, value = "CID_"),
            @Parameter(name = StringPrefixedSequenceIdGenerator.NUMBER_FORMAT_PARAMETER, value = "%05d") })
    private String id;

    ...
}

【讨论】:

  • @ThorbenJanssen 先生,这样做我们得到 hibernate_sequence table.how 以明智地获得单独的表实体。喜欢@SequenceGenerator(name = "batch_seq", sequenceName = "batch_seq", initialValue = 1, allocationSize=1)
  • 您好 Thorben 在这 -- @Parameter(name = StringPrefixedSequenceIdGenerator.INCREMENT_PARAM, value = "50") 。值 50 代表什么以及改变 id 生成中的数字变化是什么?
【解决方案2】:

我认为您正在使用数据库序列来生成 PK。所以在插入表之前添加一个触发器。例如,(在 oracle 中)

CREATE OR REPLACE TRIGGER sometable_trigger  
BEFORE INSERT ON SomeTable
FOR EACH ROW

BEGIN
  SELECT 'CID_' || to_char(sometable_seq.NEXTVAL, "00009")
  INTO   :new.id
  FROM   dual;
END;
/

假设:sequence name as "sometable_seq" and id column name id

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 2022-06-30
    • 1970-01-01
    • 2011-11-30
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多