[RESOLVIDO] Herança e JPA

9 respostas
giuliasousa

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?

9 Respostas

Hebert_Coelho

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?

giuliasousa

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?

Hebert_Coelho

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.

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.

Hebert_Coelho

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.

E pq não fazer o find direto no Cachorro?
OBS.: To desafiando ou qualquer outra coisa não tá? Só to querendo entender. >_<’’’

Lucas_Cavalcanti

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

giuliasousa

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?

Hebert_Coelho

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í.

giuliasousa

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!

Criado 17 de abril de 2012
Ultima resposta 18 de abr. de 2012
Respostas 9
Participantes 3