powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA (Hibermate) custom sequence
25 сообщений из 30, страница 1 из 2
JPA (Hibermate) custom sequence
    #38500849
abc_da
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день,

Передо мной стоит задача автоматически генерировать идентификаторы вида "ГГГГ/XXXX", где ГГГГ - номер календарного года, а XXXX - номер по порядку в рамках календарного года. С 1го января нумерация XXXX должна обнуляться.

Сгенерированные идентификаторы нужно хранить в БД (Oracle в моем случае). Насколько я понял из документации, с помощью @GenericGenerator можно реализовать логику формирования идентификатора на Java. Но в такой реализации не понятно, как синхронизировать запросы от разных клиентов? Возможно ли это в принципе?

Альтернативно, как я понимаю, логику формирования идентификатора можно реализовать на стороне БД, что, теоретически, должно решить проблему синхронизации. Я плохо знаком с БД, поэтому хочу уточнить:
1. Возможна ли реализация описанной мной логики на уровне БД? (как я понял, нужно создать свой sequence)
2. Требуются ли какие-то доп. меры для обеспечения синхронизации запросов?
3. Правильно ли я понял, что созданный sequence можно будет замапить в Hibernate с помощью аннотаций @GeneratedValue и @SequenceGenerator?

Заранее спасибо за помощь.
...
Рейтинг: 0 / 0
JPA (Hibermate) custom sequence
    #38500970
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
abc_da,
смысл задачи ускользает.
Идентификатор в БД - это число, а не строка со слэшем.
Тогда его можно использовать как первичный ключ и использовать в запросах.
.......
Да, вопрос синхронизации при методе "в БД" не стоит.
Вне БД, вопрос не стоит, если все ходят через одни ворота - хибер.
...
Рейтинг: 0 / 0
JPA (Hibermate) custom sequence
    #38501020
abc_da
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123, спасибо за ответ.
Petro123смысл задачи ускользает.
Идентификатор в БД - это число, а не строка со слэшем.
Тогда его можно использовать как первичный ключ и использовать в запросах.

Задача в том, чтобы генерировать номера по порядку в рамках календарного года. Строка со слэшем - это представление. Как я понимаю, можно сделать составной первичный ключ из полей "год" и "номер по порядку". Вопрос в том, как обеспечить автоинкремент с обнулением при переходе на новый год.

Petro123Вне БД, вопрос не стоит, если все ходят через одни ворота - хибер.

В моем случае используется кластеризация, клиенты будут ходить из разных jvm. Можно ли при генерации порядкового номера вне БД обеспечить синхронизацию на уровне БД?
...
Рейтинг: 0 / 0
JPA (Hibermate) custom sequence
    #38501059
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
abc_daЗадача в том, чтобы генерировать номера по порядку в рамках календарного года. Строка со слэшем - это представление. Как я понимаю, можно сделать составной первичный ключ из полей "год" и "номер по порядку". Вопрос в том, как обеспечить автоинкремент с обнулением при переходе на новый год.
ещё раз - Зачем так нужно?
Почему номер паспорта не состоит из года регистрации?
Или ИНН?
Представление машине или ЭВМ не нужно. Оно только для человека. Для него нет проблем сделать такое СПРАВОЧНОЕ доп-поле.
Но это не PK
...
Рейтинг: 0 / 0
JPA (Hibermate) custom sequence
    #38501063
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
abc_daЯ плохо знаком с БД, поэтому хочу уточнить:
на уровне БД вопрос в форум БД.
На уровне АппСервера - хибера - вопрос в данной ветке.
Работать будет и так и так.
...
Рейтинг: 0 / 0
JPA (Hibermate) custom sequence
    #38501159
abc_da
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123на уровне БД вопрос в форум БД.
На уровне АппСервера - хибера - вопрос в данной ветке.

В форуме по Oracle уже задал свой вопрос .
Здесь хотелось бы услышать о возможности реализации на уровне Hibernate (предпочтительный для меня вариант).

Petro123ещё раз - Зачем так нужно?
Почему номер паспорта не состоит из года регистрации?
Или ИНН?
Представление машине или ЭВМ не нужно. Оно только для человека. Для него нет проблем сделать такое СПРАВОЧНОЕ доп-поле.
Но это не PK

Чтобы было понятнее, чего я хочу добиться, приведу пример из реальной жизни:
Допустим, вы разрабатываете систему документооборота. Каждый документ имеет свой уникальный номер. В организации принято нумеровать документы одного типа по порядку в рамках календарного года, в формате "Год/номер по порядку". Нужно автоматизировать выдачу таких номеров.

Я не ставлю своей целью забубенивать в идентификатор год регистрации вместе со слэшем. "ГГГГ/ХХХХ" - это конечная цель, представление, которое я смогу сформировать налету, имея 2 поля в БД: "год" и "порядковый номер". Как запихнуть в БД год - я понимаю. Как реализовать счетчик для выдачи номеров по порядку в рамках года - нет.

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

Как можно решить поставленную задачу с применением Hibernate?
...
Рейтинг: 0 / 0
JPA (Hibermate) custom sequence
    #38501166
olexande
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А что мешает "обнулять" счетчик 31.12 в 23:59?
Например, скриптом по системному рассписанию или руками (можно забыть запустить)?
...
Рейтинг: 0 / 0
JPA (Hibermate) custom sequence
    #38501178
abc_da
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
olexande, мне хотелось бы, чтобы решение было максимально локализовано в одном месте и не требовало бы за собой ухода. Но если иначе никак - придется обнулять по расписанию, да.
...
Рейтинг: 0 / 0
JPA (Hibermate) custom sequence
    #38501317
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
abc_da,
Вы не сказали что делает бизнес при вводе нового документа задним числом?
...
Рейтинг: 0 / 0
JPA (Hibermate) custom sequence
    #38501407
abc_da
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123Вы не сказали что делает бизнес при вводе нового документа задним числом?


В моем случае такой сценарий невозможен.
...
Рейтинг: 0 / 0
JPA (Hibermate) custom sequence
    #38501455
_newcomer_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
abc_daДопустим, вы разрабатываете систему документооборота. Каждый документ имеет свой уникальный номер. В организации принято нумеровать документы одного типа по порядку в рамках календарного года, в формате "Год/номер по порядку". Нужно автоматизировать выдачу таких номеров.
Вы изобретаете велосипед.
Не делает так никто "в системах документооборота".
Номера документов виде "Год/месяц/номер по порядку/еще_что_нибудь" генерируются в момент создания документа как значения "по умолчанию" которые можно поменять при подтверждении создания документа (потому что часто их приходится "настраивать" вручную.... документооборот штука непредсказуемая).
Очередной номер документа за _требуемый_ год подставляется или выборкой максимального значения из существующих записей (например, у вас может быть отдельный столбец "год" и отдельный "номер в году") или из отдельного хранилища суммарных записей за указанный год (тоже есть варианты, от задачи зависит).
Но это все делает дополнительная бизнес-логика, а не генератор, привязанный к таблице.
Это не имеет никакого отношения к PK в БД.
Хватит велосипедов.
...
Рейтинг: 0 / 0
JPA (Hibermate) custom sequence
    #38502119
abc_da
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_newcomer_abc_daДопустим, вы разрабатываете систему документооборота. Каждый документ имеет свой уникальный номер. В организации принято нумеровать документы одного типа по порядку в рамках календарного года, в формате "Год/номер по порядку". Нужно автоматизировать выдачу таких номеров.
Вы изобретаете велосипед.
Не делает так никто "в системах документооборота".
Номера документов виде "Год/месяц/номер по порядку/еще_что_нибудь" генерируются в момент создания документа как значения "по умолчанию" которые можно поменять при подтверждении создания документа (потому что часто их приходится "настраивать" вручную.... документооборот штука непредсказуемая).

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

_newcomer_Очередной номер документа за _требуемый_ год подставляется или выборкой максимального значения из существующих записей (например, у вас может быть отдельный столбец "год" и отдельный "номер в году") или из отдельного хранилища суммарных записей за указанный год (тоже есть варианты, от задачи зависит).
Но это все делает дополнительная бизнес-логика, а не генератор, привязанный к таблице.
Согласен, это кажется мне отличным решением. Давайте в этом топике обсудим возможность такой реализации. Несколько постов назад я задал вопрос, который в свете описанного решения актуален:
abc_da2. Как обеспечить синхронизацию, учитывая, что запросы к БД могут идти из разных JVM, а каждый запрос должен гарантированно получить уникальный порядковый номер?
...
Рейтинг: 0 / 0
JPA (Hibermate) custom sequence
    #38502152
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну на самом деле автор не просил генерировать PK, а просил генерировать идентификатор документа, так что не стоит нагнетать.
Напрашивается некий синхронизированный метод, в котором номера будут выдаваться строго последовательно. Возможно, реализованный в веб-сервисе, если приложений много
...
Рейтинг: 0 / 0
JPA (Hibermate) custom sequence
    #38502166
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
abc_da1. Возможна ли реализация описанной мной логики на уровне БД?

Конечно.

abc_da (как я понял, нужно создать свой sequence)

Не думаю, что это лучший вариант.

abc_da2. Требуются ли какие-то доп. меры для обеспечения синхронизации запросов?

Если реализовать на Java, то конечно нужны блокировки.
Если на базе данных, то можно попробовать обойтись тразнакционностью до тех пор пока база не станет распределенной.

abc_da3. Правильно ли я понял, что созданный sequence можно будет замапить в Hibernate с помощью аннотаций @GeneratedValue и @SequenceGenerator?

Да, типа того.

У нас реализован альтернативный оптимистичный подход.
Делается запрос вида SELECT MAX, так чтобы получить следующий номер для текущего Года и Месяца. Потом с этим сущность персистится в базу. Если при этом вылетает Unique Constraint Violation, то номер пересоздаётся, сущность пересохраняется.

Это простое и надежное решение. Единственный его недостаток это производительность. Нужно смотреть на сколько часто у вас этот ID должен генерироваться.
...
Рейтинг: 0 / 0
JPA (Hibermate) custom sequence
    #38502245
abc_da
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczДелается запрос вида SELECT MAX, так чтобы получить следующий номер для текущего Года и Месяца. Потом с этим сущность персистится в базу. Если при этом вылетает Unique Constraint Violation, то номер пересоздаётся, сущность пересохраняется.

Это простое и надежное решение. Единственный его недостаток это производительность. Нужно смотреть на сколько часто у вас этот ID должен генерироваться.


Спасибо большое, мне такое решение подойдет. Подскажите, куда лучше прикрутить вызов логики заполнения поля, в @PrePersist или через @GeneratedValue и @GenericGenerator?
...
Рейтинг: 0 / 0
JPA (Hibermate) custom sequence
    #38502262
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вот подумал ещё немного. Идеальным ведь вариантом будет запрос вида
INSERT с SELECT подзапросом MAX() + 1.
...
Рейтинг: 0 / 0
JPA (Hibermate) custom sequence
    #38502263
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczЯ вот подумал ещё немного. Идеальным ведь вариантом будет запрос вида
INSERT с SELECT подзапросом MAX() + 1.
У нас просто логика генерации такого ID гораздо более замороченая, поэтому решили оставить в Java.
...
Рейтинг: 0 / 0
JPA (Hibermate) custom sequence
    #38502278
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
на самом деле решения вида SELECT MAX при некоторых настройках транзакций могут приводить к дедлокам в базе. Лучше уж сериализацию через синхронизируемый метод
...
Рейтинг: 0 / 0
JPA (Hibermate) custom sequence
    #38502287
abc_da
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczЯ вот подумал ещё немного. Идеальным ведь вариантом будет запрос вида
INSERT с SELECT подзапросом MAX() + 1.
Такое можно сделать на JPA/Hibernate? +мне ведь еще с нуля каждый год нужно начинать.

abc_daПодскажите, куда лучше прикрутить вызов логики заполнения поля, в @PrePersist или через @GeneratedValue и @GenericGenerator?
Почитал, пишут, что по спецификации @GeneratedValue не предназначен для non-PK полей. Выходит, @PrePersist - мой вариант?
...
Рейтинг: 0 / 0
JPA (Hibermate) custom sequence
    #38502297
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
abc_daТакое можно сделать на JPA/Hibernate? +мне ведь еще с нуля каждый год нужно начинать.
SELECT MAX(SUBSTRING(columnName, ...)) ...
+ @SQLInsert(sql="...
...
Рейтинг: 0 / 0
JPA (Hibermate) custom sequence
    #38502310
abc_da
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ivanraЛучше уж сериализацию через синхронизируемый метод
что это такое?
...
Рейтинг: 0 / 0
JPA (Hibermate) custom sequence
    #38502326
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraна самом деле решения вида SELECT MAX при некоторых настройках транзакций могут приводить к дедлокам в базе.
Интересно. Спасибо.
...
Рейтинг: 0 / 0
JPA (Hibermate) custom sequence
    #38502329
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
abc_daivanraЛучше уж сериализацию через синхронизируемый метод
что это такое?
Serializable Transaction, вероятно.
...
Рейтинг: 0 / 0
JPA (Hibermate) custom sequence
    #38502332
abc_da
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczabc_daТакое можно сделать на JPA/Hibernate? +мне ведь еще с нуля каждый год нужно начинать.
SELECT MAX(SUBSTRING(columnName, ...)) ...
+ @SQLInsert(sql="...Идея понятна, спасибо. Но как обеспечить "номер по порядку в рамках календарного года" с помощью SQL-выражения - не совсем понятно. Можно сделать что-то вроде MAX(SUBSTRING(columnName, ...) WHERE год=текущий год и default=0, если MAX вернул пустое множество?
...
Рейтинг: 0 / 0
JPA (Hibermate) custom sequence
    #38502337
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
abc_daНо как обеспечить "номер по порядку в рамках календарного года" с помощью SQL-выражения - не совсем понятно. Можно сделать что-то вроде MAX(SUBSTRING(columnName, ...) WHERE год=текущий год и default=0, если MAX вернул пустое множество?
Ну, вы же программист. Детали-то уже очевидны. Да, через WHERE делать выборку за нужный год или месяц.
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA (Hibermate) custom sequence
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]