Генерация последовательностей
Механизм генерации последовательностей позволяет получать уникальные числовые значения через единый API, независимо от типа СУБД.
Точкой входа в этот механизм является интерфейс Sequences
, который может быть инжектирован в компонент или экран:
@Autowired
private Sequences sequences;
После этого вы можете использовать метод createNextValue()
для генерации следующего числа в последовательности, передаваемой в качестве параметра:
Long nextNumber = sequences.createNextValue(Sequence.withName("some_seq"));
Интерфейс Sequences
предоставляет следующие методы:
-
createNextValue()
– возвращает следующее значение в последовательности. Механизм позволяет одновременно управлять несколькими последовательностями, идентифицируемыми произвольными строками. Имя последовательности, из которой нужно извлечь значение, передается в статическом методеSequence.withName()
.Последовательности не требуют инициализации. Когда
createNextValue()
вызывается в первый раз, создается соответствующая последовательность и возвращается значение по умолчанию1
. -
getCurrentValue()
– возвращает текущее значение последовательности. -
setCurrentValue()
– устанавливает новое текущее значение для последовательности. При следующем вызовеcreateNextValue()
для этой последовательности будет возвращено это значение + приращение. -
deleteSequence()
– удаляет последовательность с указанным идентификатором.
Реализация механизма генерации последовательностей зависит от типа СУБД. Поддерживаемыми типами являются SQL, Microsoft SQL Server, MySQL, Oracle и PostgreSQL. Параметрами последовательности также можно управлять непосредственно в базе данных по правилам конкретной СУБД.
Реализация интерфейса Sequences основана на последовательностях БД или полях автоматического увеличения и не гарантирует непрерывную последовательность без пробелов, гарантируется только уникальность значений. Пробелы могут возникать из-за ошибки или отката транзакции.
|
Пример использования последовательности
Каждый экземпляр Sequence
характеризуется именем, хранилищем данных, начальным значением и шагом инкрементации. Для определения этих параметров при вызове методов, упомянутых выше, можно использовать сеттеры. Например:
@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 . |