Problema com a persistencia utilizando Herança com Hibernate [RESOLVIDO]

6 respostas
I

boa tarde galera, tenho um dúvida e gostaria da ajuda d vcs.

Mapeei as classes utilizando Hibernate conforme descrito abaixo:

@Entity

@Table

@Inheritance(strategy=InheritanceType.JOINED)

public class Pessoa {
@Id
@GeneratedValue
@Column
private Integer id;
@Column
private String nome; 
@Column
private String email;

// Getters e Setters aki

}

@Entity

@PrimaryKeyJoinColumn(name=pessoa)

public class Cliente extends Pessoa {
@Column	
private String cpf;

// Getters e Setters aki

}

@Entity

@PrimaryKeyJoinColumn(name=pessoa)

public class Fornecedor extends Pessoa {
@Column	
private String cnpj;

// Getters e Setters aki

}

Observem que Pessoa não é classe abstrata, ou seja eu posso gravar informações diretamente na tabela Pessoa.

O que acontece é que eu criei o teste abaixo:

Pessoa pessoa = new Pessoa();

Pessoa.setNome(?Igor Thurler Martins?);

Pessoa.setEmail(?[email removido]?);

E gravei pessoa utilizando session.save(Pessoa);

O resultado foi exatamente o esperado, uma linha na tabela Pessoa
ID NOME EMAIL
1 Igor Thurler Martins [email removido]

Fiz um teste para Cliente e aí que ocorreu o problema

Cliente cliente = new Cliente();

cliente.setNome(?Igor Thurler Martins?);

cliente.setEmail(?[email removido]?);

cliente.setCpf(?012345678901?);

E gravei pessoa utilizando session.save(cliente);

Quando eu executei um select * from Pessoa;

O resultado esperado era:

ID NOME EMAIL
1 Igor Thurler Martins [email removido]

Já que o meu cliente já possuía dados gravados como pessoa, mas o que eu recebi foi:

ID NOME EMAIL
1 Igor Thurler Martins [email removido]
2 Igor Thurler Martins [email removido]

Olhei entaum a tabela de cliente e estava:

ID CPF
2 012345678901

O resultado que eu queria era:

PESSOA

ID NOME EMAIL
1 Igor Thurler Martins [email removido]

CLIENTE

ID CPF
1 012345678901

O que eu fiz de errado???

OBS.: Estou usando mySQL 5.1

6 Respostas

R

depois de inserir a primeira pessoa, você fez um “new cliente()”, ou seja, criou um novo objeto e persistiu ele como cliente
armazenando em pessoa e cliente, o hibernate não entende que voce está tentando inserir a mesma pessoa de antes.
a solução é você dar um find() e usar o objeto encontrado para persistir.

I

Haveria a possibilidade de me explicar utilizando um código de exemplo?
desde já agradeço sua ajuda

acjZer0

Cara sei nao , mas tantou usar update ao invez de save acho que o comando seria session.saveOrUpdate(objeto) ou lago assim.

I

ok…vou testar e ver no que dah…qq coisa eu posto aqui…

Qualquer coisa, no ruim de tudo eu farei Herança por associação…e aí eu sei q vai funcionar como eu quero…mas d qq forma tvou fazer os testes q vc falou

Obrigado pela ajuda

R

bah sei lá… algo como

Pessoa pessoa = session.find(não lembro o que vai aqui/opde ser uma query);
Cliente cliente = new Cliente();
cliente.setNome(pessoa.getNome)
cliente.setId(pesssoa.getId())
//popula o resto dos dados do cliente
session.merge(cliente); //ou persist mesmo, realmente não lembro

tipo, deve ter alguma coisa mais bonitinha de fzr isso, mas deve ser algo nessa linha, vc precisa usar a pessoa já inserida para o hibernate não salvar outro objeto.

I

Bem, eu tomei a decisão de fazer por associação mesmo

ou seja na minha classe cliente eu vou ter um atributo referenciando a Pessoa que eu quero…não consegui chegar ao resultado desejado usando herança…
Agradeço a ajuda

Criado 4 de abril de 2011
Ultima resposta 9 de abr. de 2011
Respostas 6
Participantes 3