[RESOLVIDO] Herança e JPA

Boa tarde, tenho o seguinte problema:

Eu tenho duas classes, pai e filha e persisto a classe pai e suas associações, um tempo depois eu gostaria que de transformar minha instância da classe pai já persistida anteriormente em uma instância classe filha sem perder as associações, isso seria possível usando JPA?

O que o pai tem o filho herda.

Se vc fizer pai.getBilhetes() e depois filho.getBilhetes ambos tem que te trazer o mesmo valor.

Vc fez algum teste? Deu certo/errado?

Sim, jakefrog, a questão é que a minha classe pai não é abstrata, então eu posso ter instancias da mesma, o que eu não sei é como transformar a instância da classe pai numa instância da classe filha, por exemplo, tenho uma classe mamífero que possui como atributo uma lista de órgãos, assim, eu tenho uma instância de mamífero, num determinado momento eu quero instanciar um objeto cachorro, porém não quero que seja gerada uma nova lista de órgãos pra esse cachorro, quero que ele possua a lista daquela instância de mamíferos que eu havia criado anteriormente, assim eu apenas criaria um registro na minha tabela cachorro com o mesmo ID da minha instância anterior (mamífero), isso é possível? Se sim, como?

Uma coisa que você tem que ter em mente é:
Cachorro cachorro = new Cachorro(); // OK
Mamifero mamifero = new Cachorro(); // OK
Cachorro cachorro = new Mamifero(); // ERRO

Não faz diferença se a classe pai é abstract ou não, uma vez que você fizer uma query no DB procurando por um cachorro os dados dos mamíferos virão.

E para mapear herança no banco de dados você tem três tipo, aqui tem dois posts sobre isso:Uma tabela por herança, JPA Uma Classe por Sub-Classe.

Giulia, o que vc quer é modificar um registro que já está no banco e é do tipo Mamífero?

Não sei se isso funciona, mas você pode tentar fazer algo do tipo:

Mamifero mamifero = em.find(Mamifero.class, 12);
Cachorro cachorro = new Cachorro(mamifero); // copia todos os dados do mamifero, inclusive id
em.merge(cachorro); //talvez modifique o que está no banco

se não funcionar, vc pode tentar dar um remove e persist logo em seguida.

[quote=Lucas Cavalcanti]Giulia, o que vc quer é modificar um registro que já está no banco e é do tipo Mamífero?

Não sei se isso funciona, mas você pode tentar fazer algo do tipo:

Mamifero mamifero = em.find(Mamifero.class, 12);
Cachorro cachorro = new Cachorro(mamifero); // copia todos os dados do mamifero, inclusive id
em.merge(cachorro); //talvez modifique o que está no banco

se não funcionar, vc pode tentar dar um remove e persist logo em seguida.[/quote]E pq não fazer o find direto no Cachorro?
OBS.: To desafiando ou qualquer outra coisa não tá? Só to querendo entender. >_<’’’

Pq o que está no banco não é um Cachorro, e sim um Mamífero, ela quer mudar.

Vou tentar isso que vc falou, Lucas, daí digo se funcionou.

E jakefrog, não posso dar um find no cachorro porque ele não existe, eu tenho um mamífero e quero “transformá-lo” em um cachorro, entendeu?

Se nenhuma estratégia de herança foi adotada não sei como o JPA vai agir nesse caso viu. O.o

Até eu quero saber o resultado agora. Mahauha

Depois posta aí.

Tentei o que o Lucas sugeriu, mas não deu certo, ele cria um novo registro e não salva as associações. O jeito é criar um novo registro mesmo.

Valeu pessoal!