序列生成
序列生成机制可以通过单个 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 。 |
本页是否有帮助?
感谢您的反馈