Herança com JPA e Hibernate

Boa noite.

Estou recorrendo à vossa ajuda para resolver um pequeno problema de BP (burrice de programador).

O que tenho é um banco de dados com algumas tabelas consideradas como especialização (herança).

Ex:

Pessoa

Cliente (inherits Pessoa)
Fornecedor (inherits Pessoa).

Consegui fazer o mapeamento assim:

@Entity @Table(name = "PESSOA") @Inheritance(strategy = InheritanceType.JOINED) public class Pessoa implements Serializable { ...

@Entity @Table(name = "CLIENTE") @PrimaryKeyJoinColumn(name = "IDPESSOA") public class Cliente extends Pessoa { ...

Porém, eu preciso uma forma de fazer uma promoção.
Ex: Transformar uma Pessoa em Cliente, ou Cliente em Fornecedor.

No banco de dados bastaria inserir um registro com mesmo IDPESSOA na tabela específica, mas como faço isso no mapeamento???

Desde já agradeço,

Não entendi direito o que vc quer… me parece que seu mapeamento está ok… Tente explicar de outra forma

Então, paulo_alonso,

O mapeamento até é tranquilo. O que me falta é uma forma de converter uma Pessoa em Cliente, ou um Cliente em Fornecedor, e persistir isso mantendo o mesmo registro na tabela Pessoa.

Ex:
Tenho:

IDPESSOA NOME
500 Fulano

Daí quero recuperar este registro (que é um objeto to tipo Pessoa), transformar ele em Cliente e persistir de forma que seja apenas gravado um registro na tabela CLIENTE com o mesmo IDPESSOA.

Entendeu?

Grato,

[code]Pessoa p = new Pessoa();
p.setNome(“Paulo Alonso”);

manager.persist§;

Cliente c = (Cliente) p;

c.setCategoria(“Lojista”);

manager.persist©;[/code]

Acho que é isso…

Pois é…

Tentei fazer com Cast forçado, deste jeito, mas não deu certo.
Este Cast dá erro.

Não tenho os fontes aqui, agora, mas amanhã posto aqui o erro que deu.

Obrigado pela atenção.

[]s

Como eu dizia, ocorre um erro no cast forçado:

Com este código:

Pessoa p = new Pessoa(); p.setIdPessoa(1); p.setNome("Sandro"); ((Fornecedor)p).setRepresentante("Alguem"); ((Cliente)p).setFantasia("Fantasia");
Ocorre este erro:

Exception in thread "main" java.lang.ClassCastException: org.persistence.Pessoa cannot be cast to org.persistence.Fornecedor at util.Teste.main(Teste.java:25)

Você não pode fazer um cast dessa maneira, e não tem nada a ver com o JPA.

observe o código: public static void main(String[] args){ Animal dog = new Dog(); Cat cat = (Cat) dog; }Esse código compila sem problemas. O que o compilador vê? o downcasting de Animal para Cat, e isso é perfeitamente válido. Só que na realidade a variável dog tem a referência de uma instância de Dog, e não de Animal, portanto será lançada uma exceção em tempo de execução.

Fez sentido?

Exatamente. O Java não consegue converter neste caso pois a instância é de uma classe “desconhecida”. No seu exemplo, Dog é um Animal. Mas não pode ser, via CAST, um Cat.
No meu caso o que preciso é exatamente converter um Dog em Cat. Ou, um Cliente em Fornecedor.

Alguma sugestão???

[quote=jackyellow]Exatamente. O Java não consegue converter neste caso pois a instância é de uma classe “desconhecida”. No seu exemplo, Dog é um Animal. Mas não pode ser, via CAST, um Cat.
No meu caso o que preciso é exatamente converter um Dog em Cat. Ou, um Cliente em Fornecedor.

Alguma sugestão???[/quote]

Não dá, cara. Você não vai conseguir ter um representante e um fantasia no mesmo objeto nessa modelagem. Não faz sentido.

Tente assim

Pessoa p = new Pessoa();
p.setIdPessoa(1);  
p.setNome("Sandro");          
Fornecedor f = (Fornecedor) p; 
f.setRepresentante("Alguem");  
Cliente c = (Cliente) p;
c.setFantasia("Fantasia");

Para mudar de Cliente para Fornecedor

Cliente c = new Cliente();
Pessoa p = (Pessoa) c;
Fornecedor f = (Fornecedor) p;

Não testei, veja se funciona… Faz um tempinho q não mexo com java, não me lembro certinho essa questão do cast… Sei que no meu tcc usei algo parecido, pq eu tinha uma classe de controle que manipulava Pessoa, PesFis extends Pessoa, PesJur extends Pessoa, Funcionario extends PesFis, e eu manipulava sempre a partir de Pessoa, passando como parâmetro nos métodos que tipo de pessoa eu ia manipular.

Abraço!

Abraço

E como eu poderia resolver esta situação?
Como eu poderia pegar do Cliente a instancia de Pessoa e depois transformar em Fornecedor?
Ou que outro padrão de projeto eu devo usar?
Talvez com interfaces, ou alguma forma “bonita” de resolver.

Att,

Acabei mudando pra Composição, já que com herança, pelo que vi, não tem jeito.