|
NHibernate: генерация кастомного ID
|
|||
---|---|---|---|
#18+
Всем привет! Есть следующая задачка. Есть распределенная POSTGRESQL БД. То есть есть ЦБД и множество БД. Все они имеют одинаковую структуру и данные в них синхронизируются. Соответственно встала задача уникальности каждой записи в таблице в рамках всей распределенной БД. Программа, которая работает с базами данных написана на C# и использует Fluent NHibernate. То есть все общение с данными через NHibernate происходит. Так вот задачу уникальности я решил делать так: у каждой БД есть номер org_id. Также для таблиц есть сиквенс. Генерим ID с помощью сиквенса, а далее вычисляем окончательное значение ID, как ID * 1000 + org_id. Все это генерим в Before Insert триггерах к таблицам. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32.
Так вот проблема в том, что NHibernate не получает новое значение сгенерированное в триггере. Юзал стандартный тип генерации: Код: c# 1. 2. 3. 4. 5.
в этом случае после инсерта ОРМ делает select lastval() - а это последнее значение выбранное из сиквенса за текущую сессию, соот-но он без номера бд. Также юзал и trigger-identity тип генерации, который как раз для триггеров before insert сделан: Код: c# 1.
тут я получаю ошибку "nhibernate assertionfailure null identifier". Братья и сестры, добрые, помогите, уже два дня гуглю. Ниче не нашел( Может быть альтернативное решение подскажите... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2012, 20:36 |
|
NHibernate: генерация кастомного ID
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2012, 21:56 |
|
NHibernate: генерация кастомного ID
|
|||
---|---|---|---|
#18+
Спасибо, а на Fluent, как написать не в курсе случайно? Че то примеров в инете ваще нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2012, 22:26 |
|
NHibernate: генерация кастомного ID
|
|||
---|---|---|---|
#18+
Код: c# 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2012, 22:30 |
|
NHibernate: генерация кастомного ID
|
|||
---|---|---|---|
#18+
Большое спасибо! Сейчас попробую кастомную генерацию, но в таком случае надо будет делать запрос к секвенсу. Не знаете, почему ошибка NHibernate.AssertionFailure: null identifier возникает при TriggerIdentityGenerator: Код: c# 1.
и как можно было бы ее обойти? Это баг NHibernat'а? Ккстати, интересно, что ,если смотреть в профайлере NHibernate sql, то там следующее: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
...Какой-то странный sql формируется.... далее профайлер пишет: ERROR: Код: plsql 1.
Почему так? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2012, 23:20 |
|
NHibernate: генерация кастомного ID
|
|||
---|---|---|---|
#18+
Блин, что-то не получается с кастомным( Делаю генератор: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
Описываю мэппинг ID: Код: c# 1.
При создании записи выходит ошибка: Код: c# 1.
Что не так сделал? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2012, 23:47 |
|
NHibernate: генерация кастомного ID
|
|||
---|---|---|---|
#18+
AlexvmkБлин, что-то не получается с кастомным( ........ Что не так сделал? Последний вопрос снимаю... у меня ID все в меппинге типа long. Изменил генератор на Код: c# 1.
и все ок, создалась запись. Остается вопрос по trigger-identity: можно ли все-таки обойти ту ошибку и юзать триггеры СУБД? Также вопрос, как просто сделать запрос на получение следующего значения сиквенса в генераторе Код: c# 1.
через fluent nhibernate можно как-то? или уж только через ADO тут.. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2012, 00:01 |
|
NHibernate: генерация кастомного ID
|
|||
---|---|---|---|
#18+
Alexvmk, вот что то не пойму , пож уточните у вас есть таблица с полем- уникальным идентификатором этой таблицы, вы вводите еще дополнительное поле для идентификации записи относительно всей базы уникальное поле для таблицы вы генерите с наружи - назначенное, а добавочное генерите в базе данных тригером. так? если так то постзапросом select lastval вы никогда не получите уникальное поле всей базы, вернется значение уникального поля таблицы которое вы назначили с наружи, если вам надо будет узнать уникальное поле для все базы, вам надо будет тянуть всю запись на клиента. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2012, 00:02 |
|
NHibernate: генерация кастомного ID
|
|||
---|---|---|---|
#18+
AlexvmkТакже вопрос, как просто сделать запрос на получение следующего значения сиквенса в генераторе Код: c# 1.
через fluent nhibernate можно как-то? или уж только через ADO тут.. Конечно можно. Через маппинги: Код: xml 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2012, 09:14 |
|
NHibernate: генерация кастомного ID
|
|||
---|---|---|---|
#18+
Где-то в степиAlexvmk, вот что то не пойму , пож уточните у вас есть таблица с полем- уникальным идентификатором этой таблицы, вы вводите еще дополнительное поле для идентификации записи относительно всей базы уникальное поле для таблицы вы генерите с наружи - назначенное, а добавочное генерите в базе данных тригером. так? если так то постзапросом select lastval вы никогда не получите уникальное поле всей базы, вернется значение уникального поля таблицы которое вы назначили с наружи, если вам надо будет узнать уникальное поле для все базы, вам надо будет тянуть всю запись на клиента. Доброе утро, Вы не правильно поняли. Во-первых, дополнительные поля я не использую. Я бы все хотел бы генерить в триггере: а в программе просто получать значение ID. Но NHibernate выдает ошибку при trigger-identity генераторе:( ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2012, 10:55 |
|
NHibernate: генерация кастомного ID
|
|||
---|---|---|---|
#18+
МСУAlexvmkТакже вопрос, как просто сделать запрос на получение следующего значения сиквенса в генераторе Код: c# 1.
через fluent nhibernate можно как-то? или уж только через ADO тут.. Конечно можно. Через маппинги: Код: xml 1. 2. 3. 4. 5. 6.
МСУ, я имею ввиду сделать самому запрос в коде метода custom генератора, чтобы к этому значению я еще прибавил код БД справа. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2012, 10:56 |
|
NHibernate: генерация кастомного ID
|
|||
---|---|---|---|
#18+
Alexvmk, Понял ТОгда это проблемы посгресса, почему он выхватывает поле не за пределами внутренней транзакции. по второму Это очень разумно, пускай сама база заботится по уникальности, но тогда этот ключ будет на кастомным, а простым as автоинкремент и часть обязанностей с клиента снимается. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2012, 11:17 |
|
NHibernate: генерация кастомного ID
|
|||
---|---|---|---|
#18+
AlexvmkМСУ, я имею ввиду сделать самому запрос в коде метода custom генератора, чтобы к этому значению я еще прибавил код БД справа. Вот пример http://blog.anorakgirl.co.uk/2009/01/custom-hibernate-sequence-generator-for-id-field/ ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2012, 11:30 |
|
NHibernate: генерация кастомного ID
|
|||
---|---|---|---|
#18+
МСУAlexvmkМСУ, я имею ввиду сделать самому запрос в коде метода custom генератора, чтобы к этому значению я еще прибавил код БД справа. Вот пример http://blog.anorakgirl.co.uk/2009/01/custom-hibernate-sequence-generator-for-id-field/ Спасибо, сегодня вечером буду пробовать подобное написать на C#. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2012, 11:36 |
|
NHibernate: генерация кастомного ID
|
|||
---|---|---|---|
#18+
Alexvmk, а стоит ли вам мегакастомый генератор затраченных на него усилий? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2012, 13:15 |
|
NHibernate: генерация кастомного ID
|
|||
---|---|---|---|
#18+
SolYUtorAlexvmk, а стоит ли вам мегакастомый генератор затраченных на него усилий? Да какой это мегакатомный, несколько строк кода. Банальный генератор ведь. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2012, 13:24 |
|
NHibernate: генерация кастомного ID
|
|||
---|---|---|---|
#18+
МСУSolYUtorAlexvmk, а стоит ли вам мегакастомый генератор затраченных на него усилий? Да какой это мегакатомный, несколько строк кода. Банальный генератор ведь. а зачем он вообще нужен, если предположить а потом исполнить все это внутрях базы без участия клиента? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2012, 13:29 |
|
NHibernate: генерация кастомного ID
|
|||
---|---|---|---|
#18+
разве guid ЗАПИСИ не будет уникальным для всех записей базы, или я опять чето не понял? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2012, 13:33 |
|
NHibernate: генерация кастомного ID
|
|||
---|---|---|---|
#18+
Где-то в степи, не в уникальности дело, а в том, чтобы отруливать идентификаторами по, например, маске :) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2012, 13:39 |
|
NHibernate: генерация кастомного ID
|
|||
---|---|---|---|
#18+
SolYUtorAlexvmk, а стоит ли вам мегакастомый генератор затраченных на него усилий? Неособо же и это мегаксотмный. А какое Вы предложите решение для задачи уникальности ID в рамках целой распределенной БД (много отдельных баз) с учетом того, что работаем с postgres + С# + NHibernate? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2012, 14:58 |
|
NHibernate: генерация кастомного ID
|
|||
---|---|---|---|
#18+
Где-то в степиМСУпропущено... Да какой это мегакатомный, несколько строк кода. Банальный генератор ведь. а зачем он вообще нужен, если предположить а потом исполнить все это внутрях базы без участия клиента? Без клиента то без клиента, но на клиенте то нам нужно сгенерированный id как-то получить. Не делать же запрос по наименованию получать id..... Я вот и попытался без участия клиента..но не вышло, так как trigger-identity у NHibernate глючит. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2012, 15:01 |
|
NHibernate: генерация кастомного ID
|
|||
---|---|---|---|
#18+
Где-то в степиразве guid ЗАПИСИ не будет уникальным для всех записей базы, или я опять чето не понял? Я не буду с GUID работать - только long. Да, и учтите, что уникальными записи в одной таблице должны быть не только в рамках одной БД, а в рамках всех баз данных распределенной системы сюда входят базы региона: бд города Н, БД города К, ЦБД региона и т д). ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2012, 15:05 |
|
NHibernate: генерация кастомного ID
|
|||
---|---|---|---|
#18+
Alexvmk, не хотите с guid, работайте с лонгом, на сервере можно легко получить уникальное значение записи, в контексте всех хранилищ если количество баз известно, впрочем можно и без, select lastval вернет вам это значение после вставки, клиенту вообще этот механизм должен быть неизвестен, и не к чему. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2012, 16:51 |
|
NHibernate: генерация кастомного ID
|
|||
---|---|---|---|
#18+
МСУГде-то в степи, не в уникальности дело, а в том, чтобы отруливать идентификаторами по, например, маске :) дак это можно получить с помощью хешбазы + хештаблцы+ хешguidзаписи. не? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2012, 16:57 |
|
NHibernate: генерация кастомного ID
|
|||
---|---|---|---|
#18+
Где-то в степиМСУГде-то в степи, не в уникальности дело, а в том, чтобы отруливать идентификаторами по, например, маске :) дак это можно получить с помощью хешбазы + хештаблцы+ хешguidзаписи. не? Причем тут маска и "хешбазы + хештаблцы+ хешguidзаписи"? Я хочу, например, такой ID: [ddMMyyyy][sequence_num][запрос_из_вебсервиса_получение_некоего_спецномера][случайный_символ_из_строки_АБВГДЕЁЖЗИКЛМНОПРСТУФХЦЧШЩЭЮЯ][текущее_время] 1. Можно сделать это через триггер, но это зло и некроссплатформенно 2. Можно апдейтить после вставки - убого и 2 батча 3. Можно сделать через нативный инструмент ORM'а - IIdentifierGenerator Еще раз, вопрос не в уникальности стоит, а в формате. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2012, 17:11 |
|
NHibernate: генерация кастомного ID
|
|||
---|---|---|---|
#18+
МСУ, ну если - Можно сделать это через триггер, но это зло и некроссплатформенно я тогда ретируюсь, и снимаю свои пожелания.)) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2012, 17:22 |
|
NHibernate: генерация кастомного ID
|
|||
---|---|---|---|
#18+
Где-то в степиМожно сделать это через триггер, но это зло и некроссплатформенно Еще раз всматриваемся в задачу :) МСУЯ хочу, например, такой ID: [ddMMyyyy][sequence_num][запрос_из_вебсервиса_получение_некоего_спецномера][случайный_символ_из_строки_АБВГДЕЁЖЗИКЛМНОПРСТУФХЦЧШЩЭЮЯ][текущее_время] P.S. Думал, что предложишь еще вариант - не завязываться на ID, а использовать для этого другое поле. А это уже новая пища для холивара переопределения айдишников. А ты сдался... ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2012, 17:59 |
|
NHibernate: генерация кастомного ID
|
|||
---|---|---|---|
#18+
МСУ, я и думал что автор имеет ввиду дополнительное поле, а он вишь хочет упихнуть все в одно. А что, в принципе - Можно сделать это через триггер, но это зло и некроссплатформенно, это жесткий аргумент, и в прочем я с ним на сто процентов согласен, тут получается что кастомная генерация. я то вообще на сервере решил исполнить что то в таком виде id= хешбазы |хештаблцы| хешguidзаписи а потом and_ом проверять что за база, что за таблица, В прочем мог бы быть еще вариант - служебная таблица, с индексаторами всех записей базы аки лонг, но она бы не смотрелась в контексте всех хранилищ, а так я за кросплатформенность однозначно, поэтому и слинял )) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2012, 18:39 |
|
NHibernate: генерация кастомного ID
|
|||
---|---|---|---|
#18+
вообще то тут бы гуиды смотрелись ваще великолепно, ибо они глобальны для всех галактик ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2012, 18:44 |
|
NHibernate: генерация кастомного ID
|
|||
---|---|---|---|
#18+
Что то щас подумал о другом поле, в принципе,( отрываясь от желания та) не плохая мысль, еще его вынести из сущности что бы не мешалось под ногами, в виде явного интерфейса, или суб класса. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2012, 19:01 |
|
NHibernate: генерация кастомного ID
|
|||
---|---|---|---|
#18+
Короче говоря, я почти дошел до того, что хотел. Вот код: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42.
Единственное, МСУ, а как передать в генератор параметр? Я хочу имя таблицы передавать, чтобы для каждой таблицы использовался свой сиквенс. Вот в методе Generate есть какой-то object obj. Наверное, не просто так он там. Я погуглил опять же - не нашел ниче:( Подскажешь, может быть? На Fluent... ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2012, 19:53 |
|
NHibernate: генерация кастомного ID
|
|||
---|---|---|---|
#18+
Где-то в степиЧто то щас подумал о другом поле, в принципе,( отрываясь от желания та) не плохая мысль, еще его вынести из сущности что бы не мешалось под ногами, в виде явного интерфейса, или суб класса. а передачу оформить в виде Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2012, 19:59 |
|
NHibernate: генерация кастомного ID
|
|||
---|---|---|---|
#18+
Alexvmk http://docs.jboss.org/hibernate/orm/3.6/javadocs/org/hibernate/id/IdentifierGenerator.html#generate(org.hibernate.engine.SessionImplementor, java.lang.Object) Parameters: object - the entity or toplevel collection for which the id is being generated Returns: a new identifier ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2012, 20:49 |
|
NHibernate: генерация кастомного ID
|
|||
---|---|---|---|
#18+
Ребята, поздравите меня! ) Я наконец-то закончил с этой задачей! Решил не плодить последовательностей (sequences). Сделал один, на все таблицы. Его уж хватит, он длиной до 19-ти цифр. Единстевнный минус ID записей будет большой плодиться. Но ничег острашного. Итоговый код: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57.
Спасибо большое всем, кто отозвался и помог! Особенно МСУ. P.S. Почему с сайта SQL.ru так быстро выкидывает, и приходиться заново аутентифицироваться!??! Тут уж не банк-онлайн же! Зачем такая защита!? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2012, 22:46 |
|
NHibernate: генерация кастомного ID
|
|||
---|---|---|---|
#18+
AlexvmkВсем привет! Есть следующая задачка. Есть распределенная POSTGRESQL БД. То есть есть ЦБД и множество БД. Все они имеют одинаковую структуру и данные в них синхронизируются. Соответственно встала задача уникальности каждой записи в таблице в рамках всей распределенной БД. Программа, которая работает с базами данных написана на C# и использует Fluent NHibernate. То есть все общение с данными через NHibernate происходит. Так вот задачу уникальности я решил делать так: у каждой БД есть номер org_id. Также для таблиц есть сиквенс. Генерим ID с помощью сиквенса, а далее вычисляем окончательное значение ID, как ID * 1000 + org_id. Все это генерим в Before Insert триггерах к таблицам. ... Мда, мозг сломать можно, это все делается либо через гуид, либо составной идентификатор (ид-записи, ид-базы) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2012, 23:13 |
|
NHibernate: генерация кастомного ID
|
|||
---|---|---|---|
#18+
Гуиды не люблю. а я и делаю составной идентификатор. Давайте, предлагайте свое решение. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2013, 17:26 |
|
NHibernate: генерация кастомного ID
|
|||
---|---|---|---|
#18+
AlexvmkГуиды не люблю. а я и делаю составной идентификатор. Давайте, предлагайте свое решение. таки составной идентификатор УЖЕ уникальный: Код: c# 1.
при этом в Fluent NHibernate надо: 1. замаппить как CompositeId, указав две колонки 2. переопределить Equals() и GetHashCode() для класса сущности, GetHashCode можно например так: Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 22:46 |
|
|
start [/forum/topic.php?all=1&fid=17&tid=1350135]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
63ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 181ms |
0 / 0 |