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