Herança no Hibernate

9 respostas
facholi

olá…
eu preciso mapear as seguinte classes, com herança. Mas eu quero usar a herança do postgresql tb. como faço o mapeamento?

//superclasse

@Entity
@Table(name="tb_pessoas")
public abstract class Pessoa {
	@Id
	@Column(name="lg_cpf")
	private Double cpf;
	@Column(name="st_nome", length=60)
	private String nome;
	@Column(name="st_sexo", length=1)
	private String sexo;
	@Column(name="st_est_civil", length=10)
	private String estadoCivil;
	@Column(name="st_naturalidade", length=30)
	private String naturalidade;
	@Column(name="st_nacionalidade", length=30)
	private String nacionalidade;
	@Column(name="dt_nascimento")
	private Calendar nascimento;
	@Column(name="st_rg", length=15)
	private String rg;
	@ManyToMany
	@JoinTable(
			name="tb_pes_enderecos", 
			joinColumns=@JoinColumn(name="lg_pessoa"), 
			inverseJoinColumns=@JoinColumn(name="lg_endereco"),
			uniqueConstraints={@UniqueConstraint(
					columnNames={"lg_pessoa", "lg_endereco"})
			}
	)
	private List<Endereco> enderecos;
	@ManyToMany
	@JoinTable(
			name="tb_pes_contatos", 
			joinColumns=@JoinColumn(name="lg_pessoa"), 
			inverseJoinColumns=@JoinColumn(name="lg_contato"),
			uniqueConstraints={@UniqueConstraint(
					columnNames={"lg_pessoa", "lg_contato"})
			}
	)
	private List<Contato> contatos;
	...
}

//subclasse

@Entity
@Table(name="tb_alunos", uniqueConstraints={
		@UniqueConstraint(columnNames={"lg_rm"})
})
public class Aluno extends Pessoa {
	
	@Column(name="lg_rm")
	private Long rm;
	...
}

9 Respostas

T

http://www.hibernate.org/hib_docs/v3/reference/en/html_single/#mapping-declaration-subclass

facholi

ok, mas eu não entendi… :? podes me explicar?

plentz

Primeiro, você poderia explicar o que seria “Mas eu quero usar a herança do postgresql tb”?

Segundo, leia a referência do hibernate annotations com atenção que ta tudo bem explicadinho ali:
http://www.hibernate.org/hib_docs/annotations/reference/en/html_single/#d0e745

Z

No PostgreSQL existe herança de tabelas, diego: http://pgdocptbr.sourceforge.net/pg80/tutorial-inheritance.html Ele deve tá querendo refletir a herança dos objetos nas das tabelas. Acho que o Hibernate não trabalha com isso.

plentz

Bom, com isso você provavelmente vai estar mandando às favas toda e qualquer possibilidade de migrar de base. Mas acho que o Zeh está certo, o Hibernate provavelmente não trabalha com este tipo de herança.

facholi

era isso mesmo q eu queria saber… entendo q a possibilidade d migrar seria difícil, soh queria saber se o hibernate faria isso.
quando mapeio herança e gero as tabelas pelo hibernate, ele estah criando uma tabela para cada “classe filha”, repetindo os atributos da “classe mãe”… eh isso mesmo ou estou fazendo algo errado?

Z

O Hibernate deve desconhecer esse recurso de herança de tabelas do Potgresql, por isso tá gerando incluindo os atributos da classe mãe.

O que você pode tentar é enganar o Hibernate gerando as tabelas na mão.

facholi

ok, pensei nesta hipótese. valew, vou estudar a melhor maneira…
obrigado pela ajuda pessoal.

facholi

pessoal, aproveitando o assunto hibernate…
quando o hibernate gera as tabelas, as constraints são criadas com nomes gerados por ele, por exemplo: a chave primária da tabela “alunos” fica “tb_alunos_pkey”, chaves estrangeiras ficam como algo parecido com “fk68b65c29b930bfcc”.
tem como eu alterar estes nomes com alguma anotação?

Criado 7 de julho de 2006
Ultima resposta 10 de jul. de 2006
Respostas 9
Participantes 4