Можно ли * преобразовать * тип полиморфного объекта Hibernate / JPA? - PullRequest
1 голос
/ 06 августа 2010

ОБНОВЛЕНИЕ: после публикации я обнаружил, что это дубликат этого старого вопроса .


У меня странное деловое требование: мое приложение поддерживает пользователей, начинающих как "Гости", а затем регистрирующихся, чтобы стать "Зарегистрированными" пользователями.

Гости имеют ограничения по функциям: им не разрешен доступ к некоторым функциям, доступным после регистрации. Однако у них есть доступ к подмножеству функций, и они могут начать накапливать постоянные данные перед регистрацией. Многие из этих функций будут смоделированы как методы в классе сущности User, и накопленные данные будут естественным образом связаны через @ Id GuestUser.

Следовательно, я обдумываю моделирование этого в JPA / Hibernate как полиморфный тип сущности:

            User
             ^
             |
      +-------------+
      |             |
   GuestUser  RegisteredUser

Я сопоставил это с использованием столбца логического дискриминатора; нет проблем:

@DiscriminatorColumn(name="guest", discriminatorType=DiscriminatorType.INTEGER)

Это работает нормально, пока GuestUser не решит "зарегистрироваться" ...?!

Теперь я хотел бы превратить моего GuestUser в RegisteredUser, установив

    guestUser.guest = false;

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

Возможно ли это? Могу ли я как-нибудь использовать entityManager.refresh () для достижения желаемого результата? Могу ли я альтернативно создать экземпляр RegisteredUser и вручную назначить его ID значению из существующего GuestUser? (Эта идея присвоения идентификатора кажется проблематичной, так как наша устаревшая база данных требует GenerationType.AUTO.)

Ответы [ 2 ]

2 голосов
/ 06 августа 2010

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

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

0 голосов
/ 06 августа 2010

Вы пытались изменить флаг гостя, сохранить изменения, а затем загрузить новый объект из базы данных с тем же User.ID?

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