JPA está me deixando LOUCO! Help! Passo um objeto e retorna outro?!

4 respostas
Javabuntu

Pessoal estou com um problema que a JPA já esgotou minhas forças.
Estou fazendo uma busca num método FIND, passo o tipo de objeto, e o id, mas o problema é, passo um type USUARIO e ele me retorna um FUNCIONARIO!!! :shock:
Onde um Funcionario extends Usuario.
Detalhe é que no banco eu gero a chave primária do Usuário, e depois ela também é a chave primária e estrangeria do Funcionário, ou seja, gravo alguns dados na tabela de usuário e em seguida dados particulares do tipo funcionário.

método gerérico FIND, fiz o debug, mas coloquei um System.out pra mostrar as saídas:

public PersistenceObject find(IDType id) {
		em = getEntityManager();
		System.out.println("PASSO 2 "+persistenceClass);
		PersistenceObject obj =  em.find(persistenceClass, id);
		System.out.println("PASSO 3 "+obj.getClass());
		return obj;
}

E olhem só a saída:

PASSO 2 class br.com.siac.domain.Usuario
PASSO 3 class br.com.siac.domain.Funcionario

o que está acontecendo, eu passo um objeto do tipo Usuario.class e o id dele pro find da EntityManager, e ela me retorna um Funcionario
e o problema que isso acontece dentro do find da JPA.

Alguém sabe me dizer o porque disso???
lembrando, tenho sempre um usuário e funcionário com mesmas chaves primárias, pois tenho um herança, mas mesmo assim eu passando um tipo Usuario e ele retornar um Funcionário.

4 Respostas

fabiofalci

SIm, está correto.
Se o id passado é de um funcionário, que herda de usuário, mesmo que tu passe ali
no class um usuario quando ele estiver montando o objeto, pela herança, vai vir um funcionário.
Mas se for o caso tu tb pode tratar esse objeto como usuário, basta fazer o cast.

Javabuntu

fabiofalci:
SIm, está correto.
Se o id passado é de um funcionário, que herda de usuário, mesmo que tu passe ali
no class um usuario quando ele estiver montando o objeto, pela herança, vai vir um funcionário.
Mas se for o caso tu tb pode tratar esse objeto como usuário, basta fazer o cast.

ai que está o problema tmb, eu fiz o cast pra tentar remover, e acontece o mesmo problema, pois primeiro eu tenho que remover o pai, Usuario e ai ele vai remover tudo em cascata, porém mesmo eu passando um Usuario, ele entende como Funcionário e aí o delete nunca vai funcionar…

Quando faço isso:

Usuario u = (Usuario) retorno do find();
remove(u);

//  quando chega no remove, ele tenta remover e diz que o objeto é Funcionário, e deveria ser Usuário, e ai nao consegue fazer o delete

alguma sugestão pra isso funcionar?!
agradeço…

renzonuccitelli

Fazer o Casting realmente não adianta nada, já que vc passa uma referencia de um funcionário.
Uma gambiarra que vc poderia fazer era ter um construtor de usuario que tomasse um funcionario como argumento. Aí vc setava os parametros do usuário nesse construtor, tendo assim uma referencia para uma instancia de um usuário e nao funcionário. Lógico que isso é uma gambiarra pesada, mas se o caso for urgente, da uma testada, até que alguém venha com uma solução boa…

Javabuntu

renzonuccitelli:
Fazer o Casting realmente não adianta nada, já que vc passa uma referencia de um funcionário.
Uma gambiarra que vc poderia fazer era ter um construtor de usuario que tomasse um funcionario como argumento. Aí vc setava os parametros do usuário nesse construtor, tendo assim uma referencia para uma instancia de um usuário e nao funcionário. Lógico que isso é uma gambiarra pesada, mas se o caso for urgente, da uma testada, até que alguém venha com uma solução boa…

Pois é, estou analisando possibilidades, agora não esperava que o find da JPA iria me trazer um funcionário mesmo passando o pai Usuario… .será que tem como burlar isso?
acho que vou fazer um select na mão com hql e extender meu GenericDAO pra um UsuarioDAO…

Criado 27 de outubro de 2008
Ultima resposta 28 de out. de 2008
Respostas 4
Participantes 3