GenId - генератор уникальных значений
Использование
Класс 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()
Кешированные генераторы обращаются на сервер только один раз для получения указанного количеста значений. Если в процессе работы с ними еш исчерпается, автоматически будет получена следующая группа значений с сервера.
Не все реализации генераторов поддерживают кеширование. В этом случае кешированный генератор будет вести себя как обычный.
Регистрация
Для использования генераторов в модель необходимо включить зависимость от модели
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
не будет зарегистрирован генератор, т.к.
это таблица не в базе данных.