Publicado por: jossemaravila em: Terça-feira, 30/Outubro/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:
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 {
}
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.
Cara muito bom!!!
vlww
Quarta-feira, 15/Abril/2009 às 9:30 am
Excelente post, me quebrou um galhão.
valeu!!!!