2009-08-26 1 views
2

Если у меня есть устаревшая база данных без ссылочной целостности или ключей, и она использует хранимые процедуры для всего внешнего доступа, есть ли смысл использовать nHibernate для сохранения объектов (объектов-графов)?Могу ли я использовать nHibernate с устаревшей базой данных без ссылочной целостности?

Плюс, ИП не только содержат CRUD операции, но бизнес-логику, а ...

Я начинаю думать, что торчащие с пользовательской ado.net DAL будет легче :(

Приветствия

Олли

+0

Первичных ключей нет? –

+0

Нет ключей, индексов, столбцов идентификаторов, ограничений по внешнему ключу - в значительной степени одна из худших устаревших БД, которые я видел некоторое время, и я не хочу ничего менять в БД, опасаясь сломать что-то, что я делаю Знать или контролировать ... :) – AwkwardCoder

ответ

1

вы, скорее всего CAN. Но вы, вероятно, не следует :-)

Hibernate не заботится о ссылочной целостности как таковой; в то время как очевидно, что у него есть какая-то связь между связанными таблицами, не имеет значения, существует ли фактическое ограничение FK. Например, если Product отображается как many-to-one, то в Vendor, PRODUCTS таблица должна иметь в своем роде VENDOR_ID, но она не обязательно должна быть FK.

В зависимости от ваших подписей SP вы можете или не сможете использовать их в качестве пользовательских CRUD в своих сопоставлениях; если у SP действительно есть бизнес-логика в них, которая применяется во время всех операций CRUD, это может быть вашей первой потенциальной проблемой.

Наконец, если ваш SPs действительно используется для ВСЕХ операций CRUD (включая все возможные запросы), это, вероятно, просто не стоит того, чтобы попытаться ввести Hibernate в микс - вы получите довольно много ничего, и вы будете иметь еще один слой для решения.

0

хорошо, пример проблемы заключается в следующем:

SP использует SQL заявление, аналогичное следующему, чтобы выбрать следующий Id для вставки в столбец «Id» таблицы (этот столбец просто столбец INT но не столбец идентификаторов),

заявление: «выберите @cus_id = макс (ID) + 1 от клиентов»,

так, как только следующий идентификатор вычисляется он вставляется в таблицу а с другими данными , то строка вставляется в таблицу B, где есть ссылка на таблицу A (без ограничения внешнего ключа) на другой столбец из таблицы A, а затем, наконец, строка является inserte d в таблицу C, используя ту же самую ссылку на таблицу A.

Когда я отобразил это в NH с использованием свободной NH, карта сгенерировала правильную инструкцию 'insert' sql для первой таблицы, но когда вторая таблица была отображена как ' Ссылка 'an' update 'sql statement была создана, я ожидал увидеть инструкцию «insert» ...

Теперь факт отсутствия столбцов идентификации, никаких ключей и средств ссылочной целостности для меня, что я могу «т гарантия отношения являются один-к-одному, один-ко-многим и т.д ...

Если это так, то как NH (свободный), выполненный либо ...

Cheers

Ollie

+0

Вы, кажется, путаете ограничения db/генерации id с отображением Hibernate. Вам _DO_ нужно, чтобы идентификаторы отображались в Hibernate; но они не должны полагаться на столбец идентичности (например, вы можете использовать генераторы «назначенные» или «приростные»), а Hibernate не заботится о ограничениях PK/FK. Тем не менее, выбор max (id), как вы показали ниже, является очень проблематичным, если вы не можете гарантировать порядок выполнения (вы обязательно получите коллизии id из параллельных транзакций рано или поздно, если вы этого не сделаете) – ChssPly76

+0

Я знаю проблемы использования «select max (id)». Что касается путаницы в NH, я знаю, что вы можете указать генераторы «назначены» или «увеличивать» для столбцов идентификации. Меня смущает тот факт, что в целом рекомендуется (по документам) использовать «Ссылки» вместо «HasOne» и факт, когда я это делаю, почему он генерирует операторы «update» вместо «insert», операторы таблицы, связанные с начальной вставкой – AwkwardCoder

+0

Я пользователь Hibernate, поэтому здесь может быть немного отключена терминология. «HasOne» означает встроенный/компонент? Это будет отображаться в одну и ту же таблицу, и здесь это не имеет значения. Возможные причины, по которым Hibernate может выпустить обновление вместо вставки: (а) неправильное сопоставление вашей ассоциации; или (b) идентификаторы объектов B/C отображаются некорректно, что приводит к тому, что Hibernate предполагает, что объект уже существует (это часто происходит с «назначенными» генераторами). – ChssPly76

Смежные вопросы