Загрузка столбца CSV идентификаторов объектов в виде гидратированных объектов в NHibernate - PullRequest
1 голос
/ 09 июня 2010

У меня есть номер таблицы базы данных, которая выглядит так:

EntityId int : 1
Countries1: "1,2,3,4,5"
Countries2: "7,9,10,22"

Я бы хотел, чтобы NHibernate загружал сущности Country, идентифицированные как 1,2,3,4,5,7,9 и т. Д. При загрузке моего EntityId.

Причина этого заключается в том, что мы хотим избежать распространения объединений, поскольку существует множество таких коллекций.

Ответы [ 2 ]

1 голос
/ 17 июня 2010

Должна ли выборка стран происходить при загрузке объекта - допустимо ли выполнить запрос для их получения?(Вы можете изменить свой DAO, чтобы он выполнял запрос после извлечения сущности.) Я спрашиваю причину, по которой просто выполнение запроса по сравнению с вызовом пользовательского кода при загрузке сущностей требует меньшего количества "слесарного дела" и внутренних функций.

После изменения вашей сущности, и у вас есть списки Country1, Country2, вы можете выполнить запрос, например:

select c from Country c where c.id in (:Country1)

, передав: Country1 в качестве именованного параметра.Вы также получаете все строки для обоих наборов стран

select Entity e where e.id in (:Country1, :Country2)

Я надеюсь, что строки country1 и country2 можно использовать как есть, но я чувствую, что это не сработает.Если это так, вам следует преобразовать строки в коллекцию целых чисел и передать коллекцию в качестве параметра запроса.

РЕДАКТИРОВАТЬ: «Сантехника», чтобы сделать это более прозрачным, приходит в виде интерфейса IInterceptor.Это позволяет вам подключаться к тому, как объекты загружаются, сохраняются, обновляются, сбрасываются и т. Д. Ваша сущность будет выглядеть примерно так

   class MyEntity
   { 
       IList<Country> Country1;
       IList<Country> Country2;
       // with public getter/setters

       String Country1IDs;
       String Country2IDs;
       // protected getter and setter for NHibernate
   }

Хотя объект домена имеет два представления списка - фактические сущности,и список идентификаторов, это то же самое вторжение, которое вы имеете при объявлении обычного поля идентификатора в объекте.Коллекции (country1 и Country2) не сохраняются в файле отображения.

Имея это в виду, вы обеспечиваете реализацию IInterceptor, которая перехватывает загрузку и сохранение.При загрузке вы выбираете значение свойства countryXID, которое используется для загрузки списка стран (как я описал выше). При сохранении вы превращаете список IList стран в список идентификаторов и сохраняете это значение.

Я не смог найти документацию для IInterceptor, но есть много проектов в сети, использующих его.Интерфейс описан в этой статье .

0 голосов
/ 18 июня 2010

Нет, вы не можете, по крайней мере, не с функциональностью по умолчанию.

Учитывая, что в SQL нет строковой функции SPLIT, любому ORM будет трудно обнаружить дискретные целочисленные значения, разделенные запятыми в столбце varchar.,Если бы вы (пользовательский sql func) каким-то образом преодолели это препятствие, лучше всего было бы использовать какой-то компонентный / пользовательский тип пользователя, который все еще мог бы создать smogasbond из объединений в таблице 'Country', чтобы в итоге получить коллекциюсущностей стран ...

... но я не уверен, что это можно сделать, и это также означало бы написание с нуля механизма персистентности.

В качестве примечанияЯ должен сказать, что я не понимаю проектное решение;Вы денормализовали БД и, ну, с тех пор, когда соединения плохие?

Кроме того, другой ответ даст решение вашей проблемы без повторного проектирования базы данных и без написания большого количества экспериментального кода.Тем не менее, он не будет отвечать на ваш вопрос о гидратации субъектов страны

ОБНОВЛЕНИЕ: если подумать, вы можете обмануть, по крайней мере, для выбранной части.Вы можете сделать VIEW, чтобы разделить значения и отобразить их в виде отдельных строк:

Entity-Country1 View:
EntityId Country
1        1
1        2
1        3

и т. Д.

Entity-Country2 View:
EntityId Country
1        7
1        9
1        10

и т. Д.

Затем вы можете отобразить представление

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...