|
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 |
|
|
start [/forum/topic.php?fid=17&fpage=29&tid=1350135]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
77ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
87ms |
get tp. blocked users: |
2ms |
others: | 16ms |
total: | 230ms |
0 / 0 |