序列生成

序列生成机制可以通过单个 API 生成唯一的数字序列,并且与 DBMS 类型无关。

通过 Sequences 接口可以使用该功能,接口可以注入到 bean 或界面中:

@Autowired
private Sequences sequences;

使用 createNextValue() 方法生成给定参数序列名的下一个值:

Long nextNumber = sequences.createNextValue(Sequence.withName("some_seq"));

Sequences 接口提供下列方法:

  • createNextValue() - 返回序列的下一个值。该机制能够同时管理由任意字符串标识的多个序列。需要获取值的序列的名称通过 Sequence.withName() 静态方法传递。

    序列不需要初始化。当第一次调用 createNextValue() 方法时,将创建相应的序列并返回默认的 1

  • getCurrentValue() - 返回序列当前值。

  • setCurrentValue() - 设置序列的当前值。下一次调用 createNextValue() 方法时将返回这个值递增之后的值。

  • deleteSequence() - 删除指定标识符的序列。

序列生成机制的实现取决于 DBMS 类型。支持的数据库类型为 HSQL、Microsoft SQL Server、MySQL、Oracle 和 PostgreSQL。序列参数也可以直接在数据库中通过特定的 DBMS 规则管理。

Sequences 的实现基于数据库序列或者自增字段,并不能保证序列值的连续。仅能保证数值的唯一性。数据库错误或事务的回滚会导致序列连续性中断。

用例

Sequence 的每个实例的特性包括名称、数据存储、起始值和递增量。在调用上面提到的方法时,可以使用 setter 来定义这些参数,例如:

@Autowired
private Sequences sequences;
@Autowired
private InstanceContainer<Document> documentDc;

@Subscribe(target = Target.DATA_CONTEXT)
public void onPreCommit(DataContext.PreCommitEvent event) {
    Long number = sequences.createNextValue(Sequence.withName("document_number") (1)
            .setStore("additional") (2)
            .setStartValue(10) (3)
            .setIncrement(10)); (4)
    documentDc.getItem().setNumber(number);
}
1 生成 document_number 序列的新值。
2 通过名称指定 Sequence 使用 附加数据存储。如果未设置,则默认使用主数据存储。
3 设置 document_number 的起始值。如果未设置,则默认从 1 开始。
4 定义序列每一次的地增量,如果未设置,则默认为 1