ОБНОВЛЕНИЕ: после публикации, Я обнаружил, что это дубликат этого старого вопроса .
У меня странное деловое требование: мое приложение поддерживает пользователей, начинающих работу как «Гости», а затем регистрирующихся как «Зарегистрированные» пользователи.
Гости имеют ограничения по функциям: им не разрешен доступ к некоторым функциям, доступным после регистрации. Однако они имеют доступ к подмножеству функций и могут начать накапливать постоянные данные перед регистрацией. Многие из этих функций будут смоделированы как методы в классе сущностей 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
. )
Пытались ли вы изменить флаг гостя, сохранить изменение, а затем загрузить новый объект из базы данных с тем же User.ID?
Предпочитать делегирование наследованию. В любом случае это лучший дизайн и его легче сопоставить таким образом, чтобы это изменение четко отражало это изменение.
Вместо того, чтобы различать по подтипу, создайте роль, которую можно переназначить, если вы захотите изменить то, к чему у них есть доступ.