Hibernate пытается сделать постоянство настолько прозрачным, насколько это возможно, что означает, что он пытается следовать тем же принципам, что и обычные объекты Java. Теперь, перефразируя ваш вопрос на Java, вы получите:
Как я могу преобразовать экземпляр класса B в экземпляр (несовместимого) класса C?
И вы знаете ответ на этот вопрос - вы не можете. Вы можете создать новый экземпляр C и скопировать необходимые атрибуты, но B будет всегда быть B, а не C. Таким образом, ответ на ваш оригинальный вопрос - это нельзя сделать с помощью JPA или Hibernate API.
Однако, в отличие от простой Java, в Hibernate вы можете обмануть :-) InheritanceType.SINGLE_TABLE
отображается с помощью @DiscriminatorColumn
, и для преобразования B в C вам необходимо обновить его значение из того, что указано для B, во все, что указано для C Хитрость в том, что вы не можете сделать это с помощью Hibernate API; вам нужно сделать это с помощью простого SQL. Однако вы можете отобразить этот оператор обновления как именованный запрос SQL и выполнить его с помощью средств Hibernate.
Таким образом, алгоритм имеет вид:
- Выселить B из сессии, если она есть (это важно)
- Выполните ваш именованный запрос.
- Загрузить то, что сейчас известно как C, используя прежний идентификатор B.
- Обновлять / устанавливать атрибуты по мере необходимости.
- Persist C