Генерация последовательностей

Механизм генерации последовательностей позволяет получать уникальные числовые значения через единый 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.