序列生成

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

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

@Autowired
private Sequences sequences;

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

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

Sequences 接口提供下列方法:

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

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

  • setCurrentValue() – 设置序列的当前值。

    不同的数据库在调用 setCurrentValue() 后第一次调用 createNextValue() 时的返回值有些许不同:

    • PostgreSQL 返回设置的值加上间隔。

    • 其他的数据库只是返回设置的值。

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

序列生成机制已支持所有 Jmix 支持的数据库

序列参数也可以根据特定数据库管理系统的规则直接在数据库中进行管理。

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

用例

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

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

@Subscribe(target = Target.DATA_CONTEXT)
public void onPreSave(final DataContext.PreSaveEvent 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