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.
Excelente post, me quebrou um galhão.
valeu!!!!
Cara muito bom!!!
vlww
Simplesmente perfeito.
valeu demais.
valeu mesmo, muito obrigado.
Estou iniciando com annotations e o post foi sucinto e objetivo.
abraços
Grane Jossemar,
Mais uma vez sem querer tirou minha dúvida…kaka
Cara, Muito Bom!!!
Achava Horrível uma Herança de Três Classes usando apenas uma Tabela.Até ler o seu Post.
show de bola… tinha muito tempo que não vejo um artigo tão bom quanto este… parabéns…
Veia raro leer algo asi aqui sin embargo
hoy estoy bastante agradecido con el de hoy
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?