Hibernate -using Table для подкласса - как связать существующий объект суперкласса с объектом подкласса - PullRequest
0 голосов
/ 05 февраля 2010

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

Итак, теперь моя проблема в том, что если пользователь изначально является клерком, у него есть запись в таблице Users и таблице Clerks. Если этот пользователь хочет стать потребителем, я хочу связать запись этого пользователя с новой записью потребителя. Таким образом, даже если я передаю userId в запись потребителя, он обрабатывается как новый пользователь для сохранения и выдает исключение duplicate_key. Как сказать Hibernate связать тот же пользовательский объект с этим новым объектом Consumer?

Ответы [ 3 ]

0 голосов
/ 05 февраля 2010

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

0 голосов
/ 05 февраля 2010

По моему опыту, лучший подход - это сначала подумать об объектах и ​​классах, а затем посмотреть, что из этого генерирует hibernate.

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

Рассмотрим эту модель вместо:

У пользователя есть карта ролевых классов с (подклассами) ролей. Клерк и Потребитель являются ролями. Когда вы разрешаете роли иметь обратную ссылку на пользователя, он может работать как делегат, предоставляя атрибуты и методы, которые есть у каждого пользователя.

В коде это будет выглядеть примерно так: класс User { Карта, Роль> ролей;

<T extends Role> T as(<Class<T>> roleClass>){
    return (T) roles.get(roleClass);
}

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

0 голосов
/ 05 февраля 2010

Нет, вы не можете. Вы пытаетесь реализовать множественное наследование. Пользователь не может быть одновременно клерком и потребителем на языке, который не поддерживает множественное наследование. Если это допустимый сценарий, то вам следует отобразить с использованием композиции, а не наследования, чтобы в вашем классе User были дочерние объекты Clerk и Consumer, каждый из которых или оба могут иметь значение null.

...