Сохранять подкласс как суперкласс, используя Hibernate - PullRequest
3 голосов
/ 17 июня 2010

У меня есть подкласс и суперкласс.Однако только поля суперкласса необходимы для сохранения.

session.saveOrUpdate((Superclass) subclass);

Если я сделаю выше, я получу следующее исключение.подкласс как суперкласс?Я не предпочитаю создавать экземпляр суперкласса, а затем передавать значения из экземпляра подкласса.Потому что легко забыть обновить логику, если в будущем к суперклассу будут добавлены дополнительные поля.

Ответы [ 3 ]

2 голосов
/ 24 марта 2011

Существует тип решения этой проблемы, и он фактически описан здесь, на StackOverFlow:

Hibernate / NHibernate: как сохранить подкласс как экземпляр суперкласса

Документация Hibernate

По сути, вы просто указываете Hibernate сохранить ваш класс как суперкласс, используя строку для суперкласса, такую ​​как:

session.save ("my.superclass", подкласс);

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

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

То, что вы пытаетесь достичь, вызовет у вас много проблем.Просто представьте, что произойдет, если вы снова загрузите данные.Какой класс должен использовать Hibernate?Суперкласс?Или один из подклассов?Какой из них?

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

0 голосов
/ 17 декабря 2010

Мне также интересно узнать, как это сделать.Вот мотивирующий случай.Допустим, у меня есть объект User для представления пользователя в моем приложении.Объект User имеет несколько свойств, таких как имя пользователя, пароль, адрес электронной почты, имя и т. Д., Которые я буду хранить в базе данных.

Когда я создаю экран, который позволяет пользователю редактировать свой собственный профиль,Я хочу установить флажок «Изменить пароль», чтобы я мог показать / скрыть поле пароля, а также поле «Подтвердить пароль», чтобы они не вводили его неправильно.Я не хочу хранить эти свойства в базе данных, и они на самом деле не являются частью объекта User, поэтому я не хочу, чтобы эти поля существовали в User.Тем не менее, многие веб-фреймворки значительно упрощают создание страницы формы на основе редактируемого объекта.

Чтобы решить эту проблему, нужно создать подкласс User, давайте назовем егоEditableUser, который имеет несколько дополнительных полей, таких как «changePassword» и «verifyPassword», и использует этот объект в моей форме.Но проблема в том, что Hibernate не будет знать, как сохранить объект EditableUser.(Это также проблема того, как создать EditableUser из пользователя, которого вы загружаете из базы данных, но это выполнимо, если у вас есть конструктор копирования)

Я решил обойти эту проблему так:используйте делегирование: создайте объект EditableUser, в котором есть пользователь, а также дополнительные свойства, которые я не хочу сохранять.Это работает достаточно хорошо, за исключением того, что это означает, что все мои привязки данных в форме должны измениться, чтобы получить доступ к внутреннему объекту User, поэтому это выглядит немного грязно.

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