Mapeamento de classes com herança usando anotações Hibernate

4 respostas
jks1903

Pessoal, estou desenvolvendo um projeto que possui herança de classes e preciso persistir os dados dessas classes no banco de dados, porém não sei a maneira correta de fazer isso.

Nesse projeto tenho 5 classes citadas a seguir:

Palavra, que é a super classe do projeto.
Substantivo, Artigo, Pronome e Verbo que herdam de palavra.

No banco de dados o que desejo é armazenar os dados de todas essas classes em uma única tabela chamada palavra, pois todos esses objetos são realmente palavras. Porém estudando um pouco o Hibernate vi que tenho que anotar as classes que desejo persistir com @Entity. Cada subclasse possui atributos específicos, por exemplo, a classe Verbo possui um atributo tempoVerbal, que no banco de dados desejo que torne-se uma coluna da tabela Palavra.

Aí vem minha dúvida, devo mapear todas as classes com @Entity ou apenas a classe Palavra?

Caso eu esteja pensando errado na modelagem das classes aceito sugestoes, rsrs.

Obrigado.

4 Respostas

P

Bom dia Jovem…

Sim você deve colocar em todas as classe a anotação @Entity.

Para criar apenas uma tabela no banco ai vai da estrategia de herança que você vai utilizar.

@Inheritance(strategy= InheritanceType.TABLE_PER_CLASS)
@Inheritance(strategy= InheritanceType.SINGLE_TABLE)
@Inheritance(strategy= InheritanceType.JOINED)

nesse table per class ele ira criar no banco só a tabela referente a super classe.

Se você estiver começando agora com anotações “JPA”, indico dar uma olhada nessa apostila da K19 achei muito boa.

http://www.k19.com.br/downloads/apostilas/java/k19-k21-persistencia-com-jpa2-e-hibernate

jks1903

pbjunior2:
Bom dia Jovem…

Sim você deve colocar em todas as classe a anotação @Entity.

Para criar apenas uma tabela no banco ai vai da estrategia de herança que você vai utilizar.

@Inheritance(strategy= InheritanceType.TABLE_PER_CLASS)
@Inheritance(strategy= InheritanceType.SINGLE_TABLE)
@Inheritance(strategy= InheritanceType.JOINED)

nesse table per class ele ira criar no banco só a tabela referente a super classe.

Se você estiver começando agora com anotações “JPA”, indico dar uma olhada nessa apostila da K19 achei muito boa.

http://www.k19.com.br/downloads/apostilas/java/k19-k21-persistencia-com-jpa2-e-hibernate

pbjunior2, pesquisei sobre essas estratégias e no meu caso o que desejo conseguirei com @Inheritance(strategy= InheritanceType.SINGLE_TABLE) .

Mas apenas um esclarecimento. Com a estratégia @Inheritance(strategy= InheritanceType.TABLE_PER_CLASS) que você mencionou, o Hibernate NÃO criará no banco APENAS a superclasse, criando as demais, correto?

No meu caso, ele criaria as classes Substantivo, Artigo, VErbo e Pronome, com cada uma contendo os atributos de Palavra, certo?

Obrigado.

P

Sim isso msm, ele criara uma tabela para cada sub-classe e replicará em cada uma as informações da super-classe.
se não me engano é isso.

Bom tenho um exemplo bem simples aki referente as 3 estrategia …

vou te passar… ai você vê qual se encaixa melhor na sua situação.

ogubas

eu acho legal adotar a estratégia SingleTable em casos onde não tem muitos atributos diferentes entre as classes filhas.
provavelmente, pelo case que você tá propondo, também me parece se encaixar nesse quadro.

Criado 27 de março de 2013
Ultima resposta 30 de mar. de 2013
Respostas 4
Participantes 3