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