JPA – Mapeamento objeto relacional de Herança

30 10 2007

Por default o JPA assume que todas as classes de uma hierarquia são mapeadas em uma única tabela, que contém uma coluna que discriminará qual o tipo de subclasse é representada pelas informações do registro.

Para definir a coluna de discriminação deve-se utilizar a anotação @DiscriminatorColumn.

Abaixo são mostrados alguns detalhes de estratégias utilizadas para realizar o mapeamento de herança:

Joined:

A classe mãe é representada por uma única tabela e cada subclasse é representada por uma tabela separada que possui apenas os campos especificados na subclasse e sua PK é uma FK para a PK da tabela que representa a classe mãe.

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = “TB_PESSOA”)
public class Pessoa implements IdentifiableEntity {

@Column(name = “IC_PESSOA”, length = 1, nullable = false, insertable = true, updatable = true)
private Character tipoPessoa;
}

@Entity
@Table(name = “TB_PESSOA_FISICA”)
public class PessoaFisica extends Pessoa {
}

@Entity
@Table(name = “TB_PESSOA_JURIDICA”)
public class PessoaJuridica extends Pessoa {
}

Single Table:

A classe mãe e as subclasses são representadas por uma única tabela. Deve existir um campo na tabela para identificar qual subclasse as informações do registro representam.

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = “IC_PESSOA”, discriminatorType = DiscriminatorType.CHAR)
@DiscriminatorValue(value = “”)
@Table(name = “TB_PESSOA”)
public class Pessoa implements IdentifiableEntity {

@Column(name = “IC_PESSOA”, length = 1, nullable = false, insertable = true, updatable = true)
private Character tipoPessoa;
}

@Entity
@DiscriminatorValue(value = “F”)
public class PessoaFisica extends Pessoa {
}

@Entity
@DiscriminatorValue(value = “J”)
public class PessoaJuridica extends Pessoa {
}

A estratégia InheritanceType.SINGLE_TABLE define que os atributos definidos na classe mãe e nas classes filhas serão gravados em uma única tabela no banco de dados.

No exemplo existe ainda um atributo que identifica se a pessoa é uma Pessoa Física ou Jurídica. Na classe mãe, isto é definido utilizando-se a anotação @DiscriminatorColumn e nas classes filha a anotação @DiscriminatorValue determina qual o valor deve ser armazenado no atributo para uma pessoa física e para uma pessoa jurídica.

Veja também como fazer o mapeamento de OneToOne.



Ações

Information

9 responses

15 04 2009
Marcos

Excelente post, me quebrou um galhão.

valeu!!!!

31 08 2009
Moises

Cara muito bom!!!

vlww

27 01 2010
Eric

Simplesmente perfeito.

valeu demais.

7 01 2011
Ricardo

valeu mesmo, muito obrigado.
Estou iniciando com annotations e o post foi sucinto e objetivo.
abraços

10 03 2011
Francislei

Grane Jossemar,

Mais uma vez sem querer tirou minha dúvida…kaka

4 10 2011
davilima81

Cara, Muito Bom!!!

Achava Horrível uma Herança de Três Classes usando apenas uma Tabela.Até ler o seu Post.

25 07 2012
Anônimo

show de bola… tinha muito tempo que não vejo um artigo tão bom quanto este… parabéns…

17 06 2013
Toni

Veia raro leer algo asi aqui sin embargo
hoy estoy bastante agradecido con el de hoy

31 01 2014
Anônimo

usando a abordagem do SINGLE_TABLE, estou tendo um problema:
os atributos da subclasse nao estao sendo mapeados na tabela, sao simplesmente ignorados. O que fazer para resolver isto?

Deixe um comentário