|
|
|
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 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39376346&tid=2123316]: |
0ms |
get settings: |
9ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
98ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
84ms |
get tp. blocked users: |
2ms |
| others: | 230ms |
| total: | 466ms |

| 0 / 0 |
