Herança no Hibernate

7 respostas
vinny767

Pessoal,

Tenho uma estrutra de classes assim:

PESSOA
USUARIO extends PESSOA
PROFISSIONAL extends USUARIO
FORNECEDOR extends PESSOA

… e tenho apenas uma tabela no meu BD chamada tbl_usuario. Meu objetivo é fazer com que instancias de todas essas classes sejam armazenadas nesta tabela. Adoteti essa estratégia.

Queria pedi-los para não julgarem se é a melhor ou pior estrategia. Trata-se apenas de um exemplo didático.
Como faço pra mapear essas entidades com Annotations?

Obrigado!

7 Respostas

T

BOm, acho que o que você procura deve ser isso

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
public class Pessoa(){
     Long id;
     String nome;
}


@Entity
// Acho que precisa de mais Annotation
public class Usuario extends Pessoa(){
}

Ai vai um exemplo…eu nao uso esse caso, eu uso tabela separada, mas o que você precisa dar uma pesquisada mesmo é sobre “@Inheritance(strategy=InheritanceType.SINGLE_TABLE)”…

flw…

vinny767

Blz, cara!
E as classes filhas?
Precisa de alguma anotação? Ou anotando a classe mãe o resto fica automático?

Valeu!

filipenf

quando é SINGLE_TABLE, é necessário informar uma coluna que será considerada o tipo ( por exemplo Usuario=‘U’, Fornecedor=‘F’, etc… ) e em cada classe filha tem que mapear isso também. Dá uma olhada na documentação do hibernate.org que exemplifica isso tudo lá.

T

meu modelo…

@Entity(name="cliente")
@Inheritance(strategy=InheritanceType.JOINED)
@SequenceGenerator(name = "sq_cliente", sequenceName = "sq_cliente")
public class Cliente implements java.io.Serializable {
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "sq_cliente")
    private Long id;

   // mais atributos
}


@Entity
@PrimaryKeyJoinColumn(name="id")
public class ClienteFisica extends Cliente implements java.io.Serializable{
    
    // nao precisa ID aki, ja pega da mae
    private String nome;
    private String cpf;

    // mais atributos
}

mas eu uso JOINED…o que vc precisa eu te passei, agora da uma pesquisada…

vinny767

Eu perarei que, de fato, o Hibernate “inventou” uma coluna no insert gerado por ele… um tal de Dtype. Isso que você disse tem relação com esse DType?

T

como vc usa uma tabela só, provavelmente esse campo é des destinção :: cada classe terá um tipo pra ele poder identificar a que entidade ele é Tipo:: Pessoa - 0, Usuario - 1, etc.pra poder identificar as classes…

filipenf

Não tenho certeza, mas pode ser. Provavelmente quando você não especifica a coluna que armazenará o tipo do objeto ele usa um nome padrão dele. Verifiquei aqui, deve ser mapeado da seguinte forma:

Na sua classe Pessoa

@Entity
@DiscriminatorColumn(name="tipo",   discriminatorType=DiscriminatorType.STRING
public class Pessoa{...

nas classes que herdam de pessoa:

@Entity
@DiscriminatorValue("U")
public class Usuario {
...
@Entity
@DiscriminatorValue("F")
public class Fornecedor {...
Criado 22 de junho de 2009
Ultima resposta 22 de jun. de 2009
Respostas 7
Participantes 3