Você está na página 1de 10

05/02/2017 TiposdeheranadoHibernateRaphaelNeves

Raphael Neves - Desenvolvimento de Software

Home
Java
Design Patterns
EJB
Governana de TI
Java Server Faces
Virtualizao


Home
Java
Design Patterns
EJB
Governana de TI
Java Server Faces
Virtualizao

Home
Java
Design Patterns
EJB
Governana de TI
Java Server Faces
Virtualizao

Raphael Neves - Desenvolvimento de Software

Java, JPA

Tipos de herana do Hibernate


Quem desenvolve em Java com certeza j ouviu, e muito, que devemos priorizar o
desenvolvimento baseado em interfaces no lugar de herana a m de diminuir o
http://www.devall.com.br/blog/show/8080 1/10
05/02/2017 TiposdeheranadoHibernateRaphaelNeves

acoplamento do cdigo e torn-lo mais malevel. Porm, nem sempre


conseguimos seguir risca essa recomendao e entramos na to famigerada
herana. Nos ltimos tempos tenho percebido no ambiente de trabalho que muitos
desenvolvedores se sentem perdidos quando o assunto persistncia de dados
utilizando classes derivadas. O artigo de hoje vem para abrir um caminho de luz na
sua vida, meu amigo, e tirar essa rusga que existe entre voc, a JPA e as heranas.
Veremos de forma simpli ca, sem entrar em conceitos coadjuvantes e o
melhor,hands-on!!!!!

IMPORTANTE!!!!!!

Dependendo da forma de implementao deste recurso e complexidade do


projeto, mapear herana na JPA pode ser extremamente oneroso para a aplicao,
causando problemas srios de desempenho. Por isso, seja sapiente ao utilizar esta
abordagem

Antes de iniciar essa peregrinao, vou assumir que voc tem os seguintes
conhecimentos:

Experincia bsica em desenvolvimento de aplicaes utilizandoJava


Conhecimento bsico da especi caoJPA
Conhecimento bsico da implementao Hibernate
Saiba con gurar oarquivo persistence.xml

Desta forma, vou ignorar todos os passos bsicos de con gurao de projeto e
bibliotecas e partir para o que interessa. Vamos l!

Quando tratamos o conceito de herana na JPA, somos levados a trs formas


distintas de tratamento: o famoso tabelo, tabelas de subclasses e tabelas de
classes concretas. importante salientar que no existe uma receita de bolo
dizendo qual a melhor abordagem, pois cada caso um caso. Veremossobre
estas abordagens a seguir por meio das classes Pessoa, PessoaFisica e
PessoaJuridica.

Tabela nica por hierarquia de classes


Este o famoso tabelo! Nesta abordagem a JPA identi ca a classe pai que
determina a estratgia do mapeamento da herana e cria uma tabela nica
contendo todos os dados da super classe e suas classes derivadas. Para identi car
quem quem, necessrio especi car um discriminador para cada classe
envolvida na estrutura hierrquica da herana, tornando o processo de persistncia
e ciente para a JPA. Alm disto, ser necessrio criar um campo a mais na super
classe para atuar como o discriminador do processo todo, ou seja, dar nome aos
bois

http://www.devall.com.br/blog/show/8080 2/10
05/02/2017 TiposdeheranadoHibernateRaphaelNeves

Listagem 01 implementao da classe Pessoa

1 @Entity
2 @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
3 @DiscriminatorColumn(name = "tipo", length = 1, discriminatorType = DiscriminatorType
4 @DiscriminatorValue("P")
5 public abstract class Pessoa {
6
7 @Id
8 @GeneratedValue(strategy = GenerationType.AUTO)
9 private Long id;
10
11 @Column(insertable = false, updatable = false)
12 private String tipo;
13
14 }

O que verdadeiramente importa na classe acima so as consideraes abaixo:

@Inheritence(strategy = InheritenceType.SINGLE_TABLE): de ne que


utilizaremos o mapeamento de heranas no forma de tabela nica
@DiscriminatorColum(name = tipo, length = 1, discrimanatorType =
DiscriminatorType.STRING): informamos que as classes da estrutura sero
tipadas por meio da coluna tipo, e que o tipo do discriminador ser uma String
de tamanho 1. O discriminador poderia ser do tipo char ou inteiro.
@DiscriminatorValue(P): de ne que os registros oriundos da classe Pessoa
sero classi cados com o tipo P.

Agora vejamos a implementao das classes PessoaFisica e PessoaJuridica, ambas


muito parecidas.

Listagem 2 implementao da classe PessoaFisica

1 @Entity
2 @DiscriminatorValue("F")
3 public class PessoaFisica extends Pessoa {
4
5 @Column
6 private String cpf;
7
8 }

De nimos ento que os registros oriundos da classe PessoaFisica sero tipados


com F.

Listagem 3 implementao da classe PessoaJuridica

1 @Entity
2 @DiscriminatorValue("J")
3 public class PessoaJuridica extends Pessoa {
4

http://www.devall.com.br/blog/show/8080 3/10
05/02/2017 TiposdeheranadoHibernateRaphaelNeves

5 @Column
6 private String cnpj;
7
8 }

Por m, determinamos que a classe PessoaJurdica ser representada pelo tipo J.

Ao executarmos o nosso exemplo e inserirmos alguns dados, ser gerado no banco


de dados a tabela pessoa com os seguintes registros:

Listagem 4 tabela gerada pela estratgia de mapeamento SINGLE_TABLE

Veja que os registros so classi cados como F e J. No teremos registros do tipo


P, pois de nimos que a classe Pessoa abstrata!

necessrio muita ateno ao obter registros desta tabela, pois digamos que a
pesquisa seja baseada no ID do registros. Como a super classe do tipo Pessoa, ela
no ter acesso aos atributos CPF e CNPJ, ainda que o registro possua
discriminador. Neste caso ser necessrio veri car o tipo do dado para ento
manipular os atributos espec cos. Pesquisas customizadas por atributos
espec cos das subclassespodem minimizar este trabalho!

Tabelas por subclasses


Esta abordagem faz com que cada classeda estrutura de herana tenha sua
respectiva tabela no banco de dados, contendo os dados espec cos da classe
mapeada. Com isso, se faz necessrio que todas as tabelas das classes
derivadastenham uma chave estrangeira apontando para a chave primria da
super classe. Vejamos a implementao desta abordagem a seguir tendo como
exemplo as classes Pessoa, PessoaFisica e PessoaJuridica.

Listagem 5 implementao da classe Pessoa

http://www.devall.com.br/blog/show/8080 4/10
05/02/2017 TiposdeheranadoHibernateRaphaelNeves

1 @Entity
2 @Inheritance(strategy = InheritanceType.JOINED)
3 public abstract class Pessoa {
4
5 @Id
6 @GeneratedValue(strategy = GenerationType.AUTO)
7 private Long id;
8
9 }

Dois pontos importantes podem ser observados nesta classe:

Remoo do atributo tipo, pois no se faz necessrio descriminar o tipo de


registro no banco.
A estratgia de herana agora do tipo JOINED, de nindo assim que todas as
classes derivadas devero implementar uma chame estrangeira apontando
para a chame primria de Pessoa, no caso o atributo id.

Vejamos a implementao das classes PessoaFisica e PessoaJuridica.

Listagem 6 implementao da classe PessoaFisica

1 @Entity
2 @PrimaryKeyJoinColumn(name = "id")
3 @Table(name = "pessoa_fisica")
4 public class PessoaFisica extends Pessoa {
5
6 @Column
7 private String cpf;
8
9 }

O ponto importante desta classe a de nio do @PrimaryKeyJoinColumn(name =


id), onde o id a chave primria da super classe. Poderia ser qualquer outro
nome de sua preferncia.

A classe PessoaJuridica implementar a mesma soluo da PessoaFisica, vejamos:

Listagem 7 implementao da classe PessoaJuridica

1 @Entity
2 @PrimaryKeyJoinColumn(name = "id")
3 @Table(name = "pessoa_juridica")
4 public class PessoaJuridica extends Pessoa {
5
6 @Column
7 private String cnpj;
8
9 }

Veja a seguir as tabelas criadas no banco de dados e a estrutura de registros:

http://www.devall.com.br/blog/show/8080 5/10
05/02/2017 TiposdeheranadoHibernateRaphaelNeves

Listagem 8 tabelas criadas pela estratgia JOINED

Listagem 9 registros inseridos

Tabela por classes concretas


Esta abordagem a mais simples, mas no menos importante. Ela cria uma tabela
para cada classe concreta envolvida na estrutura de herana e no necessita de
con guraes extras nas classes derivadas. Vejamos a implementao desta
abordagem.

Listagem 10 implementao da classe Pessoa

1 @Entity
2 @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
3 public abstract class Pessoa {
4
5 @Id
6 @GeneratedValue(strategy = GenerationType.AUTO)
7 private Long id;
8
9 }

O tipo de estratgia desta abordagem passa a ser TABLE_PER_CLASS. Sugestivo,


no?!

http://www.devall.com.br/blog/show/8080 6/10
05/02/2017 TiposdeheranadoHibernateRaphaelNeves

As classes derivadas bastam ser anotadas como uma entidade JPA. Vejamos:

Listagem 11 implementao das classes PessoaFisica e PessoaJuridica

1 @Entity
2 @Table(name = "pessoa_fisica")
3 public class PessoaFisica extends Pessoa {
4
5 @Column
6 private String cpf;
7
8 }
9
10
11 @Entity
12 @Table(name = "pessoa_juridica")
13 public class PessoaJuridica extends Pessoa {
14
15 @Column
16 private String cnpj;
17
18 }

Listagem 12 tabelas criadas pela estratgia TABLE_PER_CLASS

de extrema importncia salientar que a abordagem TABLE_PER_CLASS


nosuporta estratgia de gerao de ids comoAUTO ou IDENTITY,veja a
documentao.

2.2.4.1. Table per class


This strategy has many drawbacks (esp. with polymorphic queries and associations)
explained in the JPA spec, the Hibernate reference documentation, Hibernate in
Action, and many other places. Hibernate work around most of them implementing
this strategy using SQL UNION queries. It is commonly used for the top level of an
inheritance hierarchy:

1 @Entity
2 @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
3 public class Flight implements Serializable { ... }

http://www.devall.com.br/blog/show/8080 7/10
05/02/2017 TiposdeheranadoHibernateRaphaelNeves

This strategy supports one-to-many associations provided that they are


bidirectional. This strategy does not support the IDENTITY generator strategy: the
id has to be shared across several tables. Consequently, when using this strategy,
you should not use AUTO nor IDENTITY.

Espero que tenham gostado. At a prxima.

herana, java, jpa


12/01/2017by Raphael Oliveira Neves

Written by Raphael Oliveira Neves


Engenheiro de software, evangelista de novas tecnologias e apaixonado por
arquitetura e desenvolvimento de software utilizando Java.

Posts relacionados

Design pattern: utilizando DAO genrico

25/11/2016

Entendendo o equals e o hashCode


http://www.devall.com.br/blog/show/8080 8/10
05/02/2017 TiposdeheranadoHibernateRaphaelNeves

27/01/2017

Gerenciando transaes com EJB

15/12/2016

Leave a Comment

Name (required)

Mail (required)

Website

Leave a Comment

Post anterior
Entendendo o equals e o hashCode
Prximo post
Redimensionando disco virtual do VirtualBox

Tags

http://www.devall.com.br/blog/show/8080 9/10
05/02/2017 TiposdeheranadoHibernateRaphaelNeves

cmt dao desenvolvimento design pattern disco virtual ejb equals generics governana hashCode herana java jpa jsf mercado

programao redimensionar repository string string bu er string builder ti transao virtualbox

Posts recentes
Entendendo o equals e o hashCode
Tipos de herana do Hibernate
Redimensionando disco virtual do VirtualBox
Gerenciando transaes com EJB
Diferena entre String, StringBu er e StringBuilder

Raphael Neves | 2017

http://www.devall.com.br/blog/show/8080 10/10

Você também pode gostar