NHibernate - Изменение подтипов

Ответ Майка У, представленный ниже, кажется самым легким. когда вы входите в intellij и редактируете свои доменные модели, кажется, что вы запутались, и приложение не скомпилируется, как ожидалось.

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

Если вы вносите изменения в модели вашего домена, щелкните правой кнопкой мыши папку домена. затем нажмите «восстановить» по умолчанию примерно на полпути вниз по меню. Дождитесь завершения, затем снова запустите экземпляр приложения, щелкнув правой кнопкой мыши «RunApplication» в меню, и приложение должно успешно запуститься (или с отладкой) из среды IDE

Это самый простой ответ и лучший отзыв для разработчика с минимальными дополнительными действиями по восстановлению remmeber.

спасибо Майк В.

Для команды Grails с плагином intellij - это проблема в плагине?

6
задан Andy Whitfield 25 January 2009 в 21:10
поделиться

3 ответа

Короткий ответ да, можно изменить значение различителя для конкретной строки (строк) с помощью собственного SQL.

Однако я не думаю, что NHibernate предназначается для прокладывания себе путь, так как различитель обычно "невидим" для уровня Java, где его значение, как предполагается, установлено первоначально согласно классу сохраненного объекта и никогда не изменяется.

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

  • Создайте новый экземпляр TierOneCustomer на основе информации в исходном Клиентском объекте, затем удалите исходный объект. При доверии Первичному ключу Клиента для извлечения необходимо будет принять во внимание новый PK.

или

  • Измените свой подход, таким образом, тип объекта (различитель) не должен изменяться. Вместо того, чтобы полагаться на подкласс для различения TierOneCustomer от Клиента можно использовать свойство, которое можно изменить свободно в любое время, т.е. Клиент. Уровень = 1.

Вот некоторые связанные обсуждения Быть в спящем режиме Форумов, которые могут представлять интерес:

  1. Мы можем обновить столбец различителя в, в спящем режиме
  2. Проблема таблицы в классе: различитель и свойство
  3. Преобразование сохраненного экземпляра в подкласс
10
ответ дан 8 December 2019 в 12:23
поделиться

Вы делаете что-то не так.

То, что Вы пытаетесь сделать, должно изменить тип объекта. Вы не можете сделать этого в.NET или в Java. Это просто не имеет смысла. Объект имеет точно один конкретный тип, и его конкретный тип не может быть изменен со времени, объект создается до времени объект уничтожается (черная магия, несмотря на это). Для выполнения то, что Вы пытаетесь сделать, но с иерархией классов Вы разметили, необходимо будет уничтожить клиентский объект, который Вы хотите превратиться в уровень один клиентский объект, создать новый уровень один клиентский объект и скопировать все соответствующие свойства от клиентского объекта до уровня один клиентский объект. Именно так Вы делаете это с объектами, на объектно-ориентированных языках, с Вашей иерархией классов.

Очевидно, иерархия классов, которую Вы имеете, не работает на Вас. Вы не уничтожаете клиентов в реальной жизни, когда они становятся уровнем клиенты! Не делайте этого с объектами также. Вместо этого придумайте иерархию классов, которая имеет смысл, учитывая сценарии, которые необходимо реализовать. Ваши сценарии использования включают:

  • Клиент, который ранее не является уровнем одно состояние теперь, становится уровнем одно состояние.

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

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

6
ответ дан 8 December 2019 в 12:23
поделиться

При выполнении его офлайн (например, в сценарии обновления DB), просто используйте SQL и гарантируйте непротиворечивость сами.

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

Если Вы сохраняете идентификатор и используете его для доступа к клиенту снова (например, в URL) рассматривают создание нового поля, которое содержит маркер для этого, которое будет бизнес-ключом. Так как это не идентификатор, легко создать новый экземпляр объекта и копию по маркеру (необходимо будет, вероятно, удалить маркер из старого).

1
ответ дан 8 December 2019 в 12:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: