Herança com hibernate

5 respostas
marvinsiq

Pessoal, estou com uma dúvida e espero que vcs possam me ajudar. Tenho uma classe pessoa e a classe aluno que herda de pessoa.

No meu banco eu criei as tabelas

pessoa (id_pessoa, nome, cpf, outros campos...)
aluno(id_aluno, id_pessoa, situacao, outros campos...);

os campos em negrito são as chaves... Acontece que uma pessoa pode ser aluno mais de uma vez (ter outra matricula) mas não to conseguindo mapear no hibernate o id_aluno como chave pois como ele herda de pessoa, pega a chave da classe pessoa

as minhas classes

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

	private static final long serialVersionUID = 5183527137574695283L;
	
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id_pessoa", nullable = false)
	private Integer idPessoa;

	@Column(name = "nome", nullable = false, length = 100)
	private String nome;
...
@Entity
@Table(name = "aluno")
public class Aluno extends Pessoa  {

	private static final long serialVersionUID = 942363139884847717L;
	
	@Column(name = "id_aluno", nullable = false)
	private Integer idAluno;

	@Column(name = "situacao", nullable = false, length = 100)
	private String situacao;
...

como que eu faço pra poder fazer com que o hibernate entenda que a chave da minha tabela aluno é o id_aluno e não o id_pessoa? Tentei colocar a anotação @Id no campo id_aluno mas deu erro no hibernate.

5 Respostas

J

Cara, usando a estrategia JONIED não tem como você ter um id pro aluno e um id pra pessoa…

é atraves do mesmo ID que o hibernate identifica que akele aluno é akela pessoa

marvinsiq

Neste caso qual seria a melhor solução?

RicardoCobain

Primeiramente uma dica, use somente ID nas suas classes de Modelo ao inves de COD_Pessoa ou idPessoa ou codProd … pode crer que seu codigo fica bem mais limpo
e legivel, sei que isso é estranho para quem vem do Delphi, ou outra linguagem…

No mapeamento já facilita pois vc só vai usar:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
[/b]

Prefira Long ao invés de Integer como padrão.

Se você tem:
Pessoa

  • long id
  • String nome

Em Aluno vc não precisa repetir o ID ou criar qualquer outra chave primária, pois ele vai HERDAR.
Da uma olhada como é que se faz mapeamento do herança no Hibernate…

marvinsiq

Fiz o mapeamento utilizando o método JOINED certinho e ta tudo funcionando. Tenho a tabela pessoa, e as tabelas aluno e funcionario. Minha dúvida agora é a seguinte. Tenho uma pessoa cadastrada no banco com um CPF x. Na página de cadastro de aluno, quando a pessoa digita o cpf eu busco no banco se tem alguma pessoa com aquele CPF pra poder carregar os dados relativos a pessoa e só complentar os referentes a aluno. O problema é que o hibernate me retorna um objeto do tipo Funcionario do banco, pois realmente o cpf é de um funcionario. Só que um funcionario pode ser aluno tmb. Queria pegar esse objeto como sendo instancia de pessoa pra poder cadastrar um aluno. Como que eu faço isso?

marvinsiq

Só mais uma coisa. Quando peço pra buscar pessoas pelo CPF o hibernate gera um SQL com outer join nas tabelas aluno e funcionario, retornando assim um objeto do tipo Funcionario. Não tem como forçar o hibernate a fazer a busca somente na tabela pessoa não? E se sim, com o objeto pessoa em mãos como que eu iria persisti-lo em aluno.

Criado 18 de novembro de 2009
Ultima resposta 7 de dez. de 2009
Respostas 5
Participantes 3