Como eu faço para atualizar uma “Superclasse” para uma “Subclasse” no BD, usando jpa/hibernate?
Exemplo:
EntityManager em = criaEM();
Superclasse superC = new Superclasse();
//set outros campos da Superclasse...
superC = em.merge(superC);
Até aqui nada de novo. Agora eu quero que a Superclasse seja atualizada para uma classe especializada (Subclasse). Pelo pouco que sei sobre o merge, eu teria que executar algo como:
Subclasse subC = new Subclasse();
subC.setId(superC.getID);
//... "deep copy" dos campos da Superclasse p/ Subclasse...
subC = em.merge(subC);
Quando eu executo um código semelhante ao de cima, com a estratégia “Table per subclass” (@Inheritance(strategy = InheritanceType.JOINED)), o hibernate tenta persistir novamente um registro na tabela “Superclasse”, com o mesmo ID anterior, o que gera, obviamente, uma violação de chave primária.(java.sql.SQLIntegrityConstraintViolationException).
Existe alguma forma de fazer isso, sem ter que usar HQL ou SQL? Acredito que isso seja um problema bastante comum e que deve existir a resposta p/ isso aqui mesmo no fórum, mas até o momento eu não encontrei e nem mesmo sei que palavras-chave usar para fazer essa pesquisa…
, mas ainda não conheço uma solução adequada, pois como eu já disse acima, no caso de heranças, apenas um ID é usado (na Super Classe), portanto uma PessoaFisica teria um ID e o Fornecedor outro ID (mesmo sendo a mesma pessoa).