Замените постоянный класс гибернации на класс родного брата. - PullRequest
1 голос
/ 29 марта 2011

Я работаю над проектом, использующим Hibernate для сохранения моих сущностей (полный стек включает struts2, spring, jpa & hibernate).

У меня есть два класса List и Pie, и оба наследуют от класса Widget (используя InheritanceType.JOINED). Я не могу разобраться в этой ситуации: я сохранил сущность List в базе данных. Но теперь я хочу заменить это на Pie сущность. Как я могу это сделать?

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

Знаешь ли ты какой-нибудь другой способ сделать это?

Большое спасибо.

1 Ответ

1 голос
/ 29 марта 2011

Альтернативой является использование собственных запросов для непосредственного изменения сохраненной сущности.Если вы используете столбец дискриминатора, вы можете изменить значение, хранящееся в столбце для класса A, и изменить его на значение, необходимое для класса B. Вам также необходимо изменить существующие данные, чтобы они соответствовали новому классу.

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

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

РЕДАКТИРОВАТЬ

Этот подход работает для всех стратегий наследования.Для наследования JOINED и TABLE_PER_CLASS вам понадобятся запросы на запись, которые будут переносить данные между таблицами, а также любые изменения столбцов дискриминатора, которые вам, возможно, потребуется установить на основе используемой стратегии.

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

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