Postado por: jossemaravila | Terça-feira, 30/Outubro/2007

JPA - Mapeamento objeto relacional de Herança

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.


Deixe uma reposta

Você deve estar logado para postar um comentário.

Categorias