Можно ли * преобразовать * тип полиморфного объекта Hibernate / JPA?

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


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

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

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

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

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

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

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

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

    guestUser.guest = false;

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

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

1
задан Community 23 May 2017 в 12:22
поделиться

2 ответа

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

0
ответ дан 2 September 2019 в 22:23
поделиться

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

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

2
ответ дан 2 September 2019 в 22:23
поделиться
Другие вопросы по тегам:

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