GenId - генератор уникальных значений

Связи
  • jandcode.core.dbm.genid.GenId (class)
  • jandcode.core.dbm.genid.GenIdService (class)

Использование

Класс jandcode.core.dbm.genid.GenId представляет собой поименнованный генератор уникальных значений.

Через сервис модели jandcode.core.dbm.genid.GenIdService можно получить генератор и работать непоседственно с ним.

// получаем сервис GenIdService
GenIdService svc = getModel().bean(GenIdService.class)

// получаем генератор
GenId genId = svc.getGenId("my_gen")

// получаем следующее уникальное значение
long val = genId.getNextId()

Класс jandcode.core.dbm.mdb.Mdb так же имеет методы для работы с генераторами:

// ... где-то в методе dao ...

// получаем генератор по имени
GenId genId = getMdb().getGenId("my_gen")

// получаем следующее уникальное значение
long val = getMdb().getNextId("my_gen")

Генераторы, полученные через mdb выполняют свои запросы через существующее в mdb соединение. Генераторы, полученные через сервис GenIdService используют собственное соединение и транзакцию. При необходимости генератор можно принудительно использовать определенную mdb:

// получаем сервис GenIdService
GenIdService svc = getModel().bean(GenIdService.class)

// получаем генератор с привязкой к mdb
GenId genId = svc.getGenId("my_gen").withMdb(getMdb())

Кешированные генераторы

При необходимости использования большого числа сгенерированных значений, например при массовой вставке записей, можно использовать кешированный генератор:

// получаем кешированный генератор по имени
// с указанием сколько значений нам потребуется
GenId genId = getMdb().getGenId("my_gen", 20)

// получаем следующее уникальное значение
long val = genId.getNextId()

Кешированные генераторы обращаются на сервер только один раз для получения указанного количеста значений. Если в процессе работы с ними еш исчерпается, автоматически будет получена следующая группа значений с сервера.

Note

Не все реализации генераторов поддерживают кеширование. В этом случае кешированный генератор будет вести себя как обычный.

Регистрация

Для использования генераторов в модель необходимо включить зависимость от модели jandcode.core.dbm.genid. Она содержит стандартные реализации генераторов для различных баз данных.

По умолчанию для каждого домена, который представляет собой таблицу в базе данных регистрируется генератор с именем, совпадающем с именем таблицы. Кроме того, можно регистрировать генераторы без привязки к имени таблицы. Пример:

<root>

    <dbm>
        <model name="my-model">

            <!-- подключаем реализацию генераторов -->
            <include name="jandcode.core.dbm.genid"/>

            <domain name="my_table_1" parent="id" tag.db="true"
                    genid.start="1000" genid.step="2">
            </domain>

            <domain name="no_db_table" parent="id">
            </domain>

            <genid name="my_gen_1"/>
            <genid name="my_gen_2" start="2000" step="1"/>

        </model>
    </dbm>

</root>

В этом примере регистрируются следующие генераторы:

  • my_table_1, так как домен my_table_1 является таблицей в базе данных (tag.db="true"). У этого генератора начальное значение по умолчанию 1000 с шагом приращения 2
  • my_gen_1, явно зарегистрированный, вне описания таблиц. Начальное значение и шаг приращения будут установлены в значения по умолчанию (1000 и 1) соответсвенно
  • my_gen_1, явно зарегистрированные, вне описания таблиц. Начальное значение и шаг приращения будут взяты из свойств start и step

Для домена no_db_table не будет зарегистрирован генератор, т.к. это таблица не в базе данных.