|
|
|
Hibernate generator без таблицы
|
|||
|---|---|---|---|
|
#18+
Возникла задача генерировать последовательные уникальные id для нетабличных данных. В проекте используется hibernate, поэтому решено было использовать готовые механизмы. Как выяснилось, hibernate не предоставляет прямого доступа к генераторам. Копание в исходниках привело к такому коду: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. Что не нравится: - если мы хотим переносимости, и чтобы всё само генерировалось, то надо объявлять Код: xml 1. В этом случае генерируется ненужная таблица DUMMY_DOC, на каждый генератор - своя. Ну это ладно, можно обойти, не объявлять автоапдейт, и генерировать таблицу IDS руками, благо ничего там сложного нет - использование непубличных интерфейсов SessionFactoryImplementor и SessionImplementor . Вот это неприятно, интерфейсы эти меняются, в разных версиях хибернейт они разные. Тоже можно полечить, вызвав соответствующие методы рефлексией, но как-то это некрасиво. Есть ли более верное решение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2016, 16:07 |
|
||
|
Hibernate generator без таблицы
|
|||
|---|---|---|---|
|
#18+
ivanra, А почему нельзя тупо SQL выполнить для sequence? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2016, 16:19 |
|
||
|
Hibernate generator без таблицы
|
|||
|---|---|---|---|
|
#18+
Можно, но не хочется разруливать диалекты. Есть некоторая неопределеннсть с сервером, скорее всего это будет mssql или mysql, а там и генераторов то нет. Короче, хочется всё, что может поменяться, вынести в конфиги (аннотации это я для простоты привел), а там чтобы программа сама сгенерировала что надо, в зависимости от диалекта и заданной стратегии. У хибернейт это неплохо получается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2016, 16:28 |
|
||
|
Hibernate generator без таблицы
|
|||
|---|---|---|---|
|
#18+
ivanra, Можно в рантайме вытащить диалект и у него вызвать метод типа getSelectSequenceNextValString() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2016, 16:32 |
|
||
|
Hibernate generator без таблицы
|
|||
|---|---|---|---|
|
#18+
не лучше. - Dialect всё равно надо вытаскивать через SessionFactoryImplementor - sequence стратегия может быть неприменима к данному диалекту Есть еще вариат с помощью deprecated метода получить фабрику генераторов, тогда можно обойтись без таблицы-пустышки, но писанины врядли будет меньше Код: java 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2016, 16:54 |
|
||
|
Hibernate generator без таблицы
|
|||
|---|---|---|---|
|
#18+
ivanraВозникла задача генерировать последовательные уникальные id для нетабличных данных. переведи задачу. На момент разработки не знаете БД или что? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2016, 17:13 |
|
||
|
Hibernate generator без таблицы
|
|||
|---|---|---|---|
|
#18+
Petro123ivanraВозникла задача генерировать последовательные уникальные id для нетабличных данных. переведи задачу. На момент разработки не знаете БД или что? Не знаем, база будет та, которую заказчик использует в хранилище jackrabbit jcr, скорее всего mysql (sequence нет). В данном случае она идет как бесплатный довесок (какая-то база там обязательно должна быть). Генератор, в принципе, можно было бы хранить просто в файле. Но не хочется разводить писанину с синхронизацией, а просто взять готовый отлаженный механизм. Генератор из hibernate - как вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2016, 17:26 |
|
||
|
Hibernate generator без таблицы
|
|||
|---|---|---|---|
|
#18+
ivanraНе знаем, база будет та, которую заказчик использует в хранилище jackrabbit jcr, скорее всего mysql (sequence нет). cq5 старой версии что ли? jackrabbit это ж вроде самом по себе хранение данных альтернативное реляционному. каким боком тут база? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2016, 17:51 |
|
||
|
Hibernate generator без таблицы
|
|||
|---|---|---|---|
|
#18+
questioner jackrabbit это ж вроде самом по себе хранение данных альтернативное реляционному. каким боком тут база? а Persistent Manager? Да, возможны варианты, но в данном случае будет обязательно использоваться Database PM ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2016, 18:02 |
|
||
|
Hibernate generator без таблицы
|
|||
|---|---|---|---|
|
#18+
ivanraскорее всего mysql (sequence нет). ну дак в половине баз нет сиквенсов, но есть счётчик-поле. Как половина программистов на них работает и не жужжит? Я по прежнему не понял проблему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2016, 20:12 |
|
||
|
Hibernate generator без таблицы
|
|||
|---|---|---|---|
|
#18+
ivanraГенератор, в принципе, можно было бы хранить просто в файле. смотри выше - есть тип поля счетчик. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2016, 20:13 |
|
||
|
Hibernate generator без таблицы
|
|||
|---|---|---|---|
|
#18+
questionerjackrabbit это ж вроде самом по себе хранение данных альтернативное реляционному. каким боком тут база? ну ТС даёт. Любая БД по ТЗ. Да ещё реляционная и НЕрялиционная). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2016, 20:15 |
|
||
|
Hibernate generator без таблицы
|
|||
|---|---|---|---|
|
#18+
Petro123, если хочется ответить, прошу внимательней читать вопрос, он в самом начале. Нужен проверенный генератор последовательных значений не для поля в таблице . Такой, как генератор/sequence в sql сервере - конкурентный, с сохранением состояния. Желательно настраиваемый через конфигурационные файлы. По условиям задачи имеется SQL сервер, хотя это тут не главное. Я привел вариант решения с использованием механизмов хибернейт. Всего 5 строчек кода, но с хаками. Есть другие варианты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2016, 09:38 |
|
||
|
Hibernate generator без таблицы
|
|||
|---|---|---|---|
|
#18+
ivanraВозникла задача генерировать последовательные уникальные id для нетабличных данных. А рамках чего уникальные? Например если в рамках хоста и может быть несколько инстансов то можно сделать такой вариант: AtomicLong id = new AtomicLong(processPID * CONST1 + System.currentTimeMillis() * CONST2); CONST1 и CONST2 подбираем так, чтобы заполнить старшые биты long'а. Далее id.getAndIncrement() (он на тактик быстрее incrementAndGet()). Если хостов несколько, но, к пимеру, на каждом один инстанс- заменяем processPID на hostId (не IP, а уникальный у тебя ID). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2016, 12:56 |
|
||
|
Hibernate generator без таблицы
|
|||
|---|---|---|---|
|
#18+
Alexey TominAtomicLong id = new AtomicLong(processPID * CONST1 + System.currentTimeMillis() * CONST2); Да, время надо уменьшить, конечно - NULL_DATE задаётся перед выкладкой в прод. Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2016, 12:58 |
|
||
|
Hibernate generator без таблицы
|
|||
|---|---|---|---|
|
#18+
ivanraпрошу внимательней читать вопрос нет это вы извольте писать постановку задачи, а не её решение. Из постановки у вас 3 слова: авторВозникла задача генерировать последовательные уникальные id для нетабличных данных. всё остальное - это Ваше решение придуманное в голове. Итого сначала: - для кого ID? Alexey Tomin уже выше вас спросил. - в рамках чего уникальность? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2016, 13:39 |
|
||
|
Hibernate generator без таблицы
|
|||
|---|---|---|---|
|
#18+
ivanraНужен проверенный генератор последовательных значений не для поля в таблице . Такой, как генератор/sequence в sql сервере - конкурентный, с сохранением состояния. опять двойка. По своим свойствам, sequence ничем не отличается от типа поля счетчик. Т.к. обычно на каждую таблу назначается только один sequence. Т.е. он только повторяет или эмулирует поле счетчик. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2016, 13:44 |
|
||
|
Hibernate generator без таблицы
|
|||
|---|---|---|---|
|
#18+
Petro123, мне, например, неизвестен способ получения значения типа поля счетчик без вставки в таблицу. Было бы интересно увидеть (особенно - без таблицы). Насчет уникальности ID: нужна уникальность в рамках хранилища (используется jackrabbit). Клиентов на данный момент 4, некоторые являются серверами приложений. Напрашивается решение в виде сервиса, который будет раздавать эти id, работающего на том же сервере, где хранилище. Но есть нюансы (некоторые клиенты сильно legacy, vb6 и delphi, чтоб было понятно на чем и когда они написаны). Что касается реализации, то использование возможностей sql сервера лежит на поверхности. Если в сервере есть sequence - отлично, если нет, то берем TableGenerator, и там по возможности используется select for update - коллизий тоже не будет. Да, hibernate в данном случае - это из пушки по воробью, но код очень короткий, надежный и покрывает все варианты использования. Кстати, выяснилось, что есть аннотация @Subselect, благодаря которой таблица-заглушка не генерируется. Вот как выглядит это сейчас (пример с улучшенным TableGenerator) Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2016, 14:57 |
|
||
|
Hibernate generator без таблицы
|
|||
|---|---|---|---|
|
#18+
ivanraмне, например, неизвестен способ получения значения типа поля счетчик без вставки в таблицу. Было бы интересно увидеть (особенно - без таблицы). ещё раз. sequence - это то же поле счётчик в таблице. Только табла системная внутри БД. И наверх выведено API в виде sequence. Т.е. вместо sequence можете свободно вставлять по одному полю в спец.таблицу. ivanraНасчет уникальности ID: нужна уникальность в рамках хранилища (используется jackrabbit). Клиентов на данный момент 4, некоторые являются серверами приложений. т.е. данные распределённые и есть гетерогенные транзакции? ivanraНо есть нюансы (некоторые клиенты сильно legacy, vb6 и delphi, чтоб было понятно на чем и когда они написаны). конкретнее. - дельфи что? Делает JOIN с Id? Какая разница кто клиент? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2016, 15:10 |
|
||
|
Hibernate generator без таблицы
|
|||
|---|---|---|---|
|
#18+
Petro123, утверждение насчет хранения sequence в таблицах выдают вас как юниора, по крайней мере, в sql. Но вопрос был в другом: как получить значение автоинкремента без вставки в таблицу? Конкретный код, например, в MSSQL. А без таблицы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2016, 15:34 |
|
||
|
Hibernate generator без таблицы
|
|||
|---|---|---|---|
|
#18+
ivanraутверждение насчет хранения sequence в таблицах выдают вас как юниора, по крайней мере, в sql. ваша боязнь использовать тип поля счетчик - тоже пионерство). "Расписали". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2016, 15:52 |
|
||
|
Hibernate generator без таблицы
|
|||
|---|---|---|---|
|
#18+
:) Кстати, а вот рояль в кустах. Чтобы получить значение автоинкремента без вставки записи, надо сначала её вставить, а затем откатить транзакцию. Но всё равно требуется таблица. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2016, 18:22 |
|
||
|
Hibernate generator без таблицы
|
|||
|---|---|---|---|
|
#18+
ivanra, упрямый)) Ты в оперативке ID держать будешь? Надёжно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2016, 19:07 |
|
||
|
Hibernate generator без таблицы
|
|||
|---|---|---|---|
|
#18+
ivanraPetro123, утверждение насчет хранения sequence в таблицах выдают вас как юниора, по крайней мере, в sql. Но вопрос был в другом: как получить значение автоинкремента без вставки в таблицу? Конкретный код, например, в MSSQL. А без таблицы? какой кошмар невероятной продвинутости. без таблицы нет надежно продвигаемого вперед и синхронизированного сиквенса. Вы после выключения питания и перезапуска системы с какого значения продолжать изволите? не юниор вы наш ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2016, 02:22 |
|
||
|
Hibernate generator без таблицы
|
|||
|---|---|---|---|
|
#18+
boobyivanraPetro123, утверждение насчет хранения sequence в таблицах выдают вас как юниора, по крайней мере, в sql. Но вопрос был в другом: как получить значение автоинкремента без вставки в таблицу? Конкретный код, например, в MSSQL. А без таблицы? какой кошмар невероятной продвинутости. без таблицы нет надежно продвигаемого вперед и синхронизированного сиквенса. Вы после выключения питания и перезапуска системы с какого значения продолжать изволите? не юниор вы наш Существует масса способов решения этого. И "таблица значений последовательностей"- одно из них. Как сделано в firebird/postgreSQL/mysql желающие могут посмотреть. Как в oracle/mssql/db2 - только гадать. Так что умерьте пыл, горячие финские парни :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2016, 06:23 |
|
||
|
Hibernate generator без таблицы
|
|||
|---|---|---|---|
|
#18+
booby, Иди в ПТ. Пока не научишься отвечать на простые первые уточняющие вопросы. Их было, не только от меня, штук 5. И ты ни на один не ответил. Вангую что топик твой канет в небытие с таким подходом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2016, 10:41 |
|
||
|
Hibernate generator без таблицы
|
|||
|---|---|---|---|
|
#18+
Petro123, что за топик? мой крайний топик в 9м году был. я и вопросов уже не помню от слова совсем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2016, 11:51 |
|
||
|
Hibernate generator без таблицы
|
|||
|---|---|---|---|
|
#18+
ivanraКстати, а вот рояль в кустах. Чтобы получить значение автоинкремента без вставки записи, надо сначала её вставить, а затем откатить транзакцию. А создатели oracle и firebird не знают. Там просто говоришь "дай мне следующее значение" и всё. Собственно если ты решил дёргать БД для получения значения- прослойка в виде hibernate лишняя. Кстати, надо понимать, что это (просить ID у БД) медлено . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2016, 12:05 |
|
||
|
Hibernate generator без таблицы
|
|||
|---|---|---|---|
|
#18+
booby, извини. ТС был адресован пост. Вторая страничка пустых разговоров. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2016, 12:05 |
|
||
|
Hibernate generator без таблицы
|
|||
|---|---|---|---|
|
#18+
Petro123, Ок. А мне нравится. Сижу, попкорн жую. Я люблю, когда пишут универсальные программы для работы с базами данных всего мира произвольной архитектуры. Наша мега-программа работает с любой вашей базой, за ваш счет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2016, 12:12 |
|
||
|
Hibernate generator без таблицы
|
|||
|---|---|---|---|
|
#18+
booby, Petro123, вы с корпоратива что ли на форум зашли? Написано же русским языком: нужен генератор не для поля, не для таблицы, не для базы, наконец. Генерирующий уникальные числа в рамках некоторой системы, не сбивающийся при перезагрузке системы. Ну чем мне могут помочь в этой задаче люди, задающие уточняющие вопросы про транзакции или объясняющие, что такой генератор невозможен без таблицы (а как же oracle, postgresql, firebird, вы о таких базах слышали?). Зачем мне отвечать на эти уточняющие вопросы? Я и не отвечаю. Впрочем, вот, ответил Alexey Tomin, вопрос с использованием времени рассматривается. Но тоже дело в нюансах. Часть идентификаторов уже использована (исторические данные), так что надо попасть в определенный диапазон, чтобы не пересекалось, и в этом диапазоне занимать идентификаторы "плотно". Миллисекунды дают коллизии, а нано - слишком много занимают. Хотя, подогнать можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2016, 12:44 |
|
||
|
Hibernate generator без таблицы
|
|||
|---|---|---|---|
|
#18+
ivanraAlexey Tomin, вопрос с использованием времени рассматривается. Но тоже дело в нюансах. Часть идентификаторов уже использована (исторические данные), так что надо попасть в определенный диапазон, чтобы не пересекалось, и в этом диапазоне занимать идентификаторы "плотно". Миллисекунды дают коллизии, а нано - слишком много занимают. Хотя, подогнать можно. Если дыры допустимы, то не проблема при старте умножить ms на достаточно большое число (я тут подглядел- народ на 1000 умножает) а потом инкрементировать. Вряд ли вам больше 1000000 в секунду ID надо. Если на одной машине из разчёта 1М id в секунду, то хватит на 2^63/2^20 секунд, т.е. на ~280 тысяч лет. На наш век хватит Можно даже построить систему из расчёта 10^9 id в секунду- хватит на 280 лет- тоже вряд ли доживём до претензий Если дыры допустимы, но нежелательны, то можно в БД завести sequence, получать его SQL с инкрементом на некоторое число (1000, 1000000) - если приложение основилось, то мы потерям максимум столько ID. Если дыры не допустимы вообще- то тут лучше всего ID получать каждый раз из БД. Но это узкое, очень узкое место. Ну или красиво решение- создавать id с запасом и пихать в очередь сообщений (да хоть во временную таблицу), а кому надо- читают их. Главное, чтобы кто-то говорил "хватит, довольно" вовремя ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2016, 13:13 |
|
||
|
Hibernate generator без таблицы
|
|||
|---|---|---|---|
|
#18+
ivanra, лучше бы и ты выпил рюмку портвейна, да помечтал о требованиях к своему сиквенсу, чем начинать топик словом hibernate, да сдабривать его "не таблицей". Сходи на корпоратив. Разумному человеку это помогает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2016, 13:31 |
|
||
|
Hibernate generator без таблицы
|
|||
|---|---|---|---|
|
#18+
boobyлучше бы и ты выпил рюмку портвейна, да помечтал о требованиях к своему сиквенсу, чем начинать топик словом hibernate, да сдабривать его "не таблицей". действительно). ТС с гонором. Но несёт ахинею построенную на песке. Сиквенс он любит. А вот таблицы ненавидит в любом их проявлении. Даже если хибер(БД) сам временно её генерит. @GenericGenerator Видно что базами он не занимался. Удачи ему! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2016, 13:59 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2123316]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
55ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
79ms |
get tp. blocked users: |
2ms |
| others: | 223ms |
| total: | 397ms |

| 0 / 0 |
