Abordagem para mapeamento dica

5 respostas
E

Bom dia galera,

Estou com uma dúvida eu tenho uma classe abstrata que é Pessoa, duas classes estendem a classe pessoa que são PessoaFisica e PessoaJuridica, a classe PessoaJuridica possui alguns atributos a mais do que pessoa fisica, como seria a melhor abordagem para este mapeamento.

Obrigado galera, não estou conseguindo pensar na melhor abordagem para este mapeamento.

5 Respostas

drsmachado

Mapeie pessoa como @MappedSuperclass e as demais como @Entity normalmente.
Dependendo do tipo de tabelas que você deseja, opte por uma das estratégias de Inheritance.

Hebert_Coelho

Faça como o drsmachado disse.

Utilize herança na hora da persistência.

Aqui tem dois exemplos dos três existentes: Uma tabela por herança, JPA Uma Tabela por Classe.

E

Opa galera valeu a ajuda…

Eu fiz realizando com o MappedSuperclass, agora fiz um teste utilizando as mesma entidades só que com @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
e as duas geraram o mesmo resultado estou tentando descobrir qual a diferença vou dar uma olhada agora nos dois links que você me mandou acho que vão ajudar bastante

E

Realizei os seguintes teste…

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@DiscriminatorColumn(name = "tpo_pessoa", discriminatorType = DiscriminatorType.STRING, length = 1)
@DiscriminatorValue(value = "c")
public abstract class AbstractCliente {
	@Id
	private Long id;
	@Column
	private String nome;
}

Com as seguintes heranças

@Entity
@DiscriminatorValue("F")
public class PessoaFisica extends AbstractCliente {
	@Column
	private String rg;
	@Column
	private String cpf;
	@Column(name = "data_nasc")
	private Date dataNascimento;
}
@Entity
@DiscriminatorValue("J")
public class PessoaJuridica extends AbstractCliente {
	@Column
	private String cnpj;
	@Column
	private String razaoSocial;
}

Se eu alterar a a entidade AbstractCliente e colocar apenas um @MappedSuperclass, o resultado final pelo menos no banco será o mesmo ? então qual a diferença das duas abordagens ?

drsmachado

Quando você define herança entre entidades e coloca isto para o hibernate, com a estratégia TABLE_PER_CLASS, ele irá criar uma tabela para cada classe que esteja na relação de herança.
Neste caso, mapear como @Entity ou @MappedSuperclass irá resultar no mesmo. Pois, todos os atributos acessados por getters e setters que estejam na classe abstrata, serão considerados colunas das classes que estendem dela. Porém, se ela estiver como @Entity, você deverá ter uma tabela a mais no banco de dados.

Criado 4 de junho de 2012
Ultima resposta 4 de jun. de 2012
Respostas 5
Participantes 3