Должна ли выборка стран происходить при загрузке объекта - допустимо ли выполнить запрос для их получения?(Вы можете изменить свой 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, но есть много проектов в сети, использующих его.Интерфейс описан в этой статье .