[Hibernate] Foreign Key com mapeamento de herança TABLE_PER_CLASS

9 respostas
R

Olá pessoal,

Estou com uma situação na qual gostaria de criar uma generalização entre classes que eram independentes. Para não apagar todas as tabelas e relacionamentos posteriores achei melhor usar o tipo de herança table per class, seria mais ou menos como o banco já está modelado hoje.
A minha dúvida é: Como relacionar essa tabela depois a uma outra de forma polimórfica. Ex: Imagine uma classe pessoa com heranças de pessoa física e jurídica e tenho uma outra classe, por exemplo documento, que teria uma pessoa (independente de qual tipo daí a necessidade do polimorfismo aqui). Como criar a chave estrangeira na tabela Documento para que ela se relacione com as duas tabelas PessoaFisica e PessoaJuridica e como mapear isso no hibernate para ficar com um só campo:

public class Documento{
        @ManyToOne
	@JoinColumn(name="idPessoa")//Aqui deveria entrar pessoa física e juridica
	private Pessoa pessoa;
}

9 Respostas

D

Bom preciso saber se você criou um atributo no Pessoa igual coloquei a baixo…

@OneToMany(mappedBy = "documento") private List<Documento> listDocumentos;

R

Não

D

bom...

então vou postar como eu faço... ok?

ai depois vc adapta para seu jeito =)

public class Documento{ 
@ManyToOne
	private Pessoa pessoa;
}

public class Pessoa{

	@OneToMany(mappedBy = "documento")
	private List<Documento> listDocumento;

}

modifica assim e me diz o se da certo...

R

Não, mas eu preciso mapear a pessoa dentro do documento, um documento tem uma pessoa entendeu?
É aquele exemplo que eu citei acima mesmo, mas a questão é que eu preciso de uma chave estrangeira em um campo só mas que pode estar em duas tabelas diferentes.

D

Se é o que entendi... seria mais facil vc criar uma tabela com os dados comuns entre juridico e fisica que no caso seria o Pessoa... e dentro de Pessoa teria Juridico e Fisico... o Hibernate trabalharia bem fazendo assim... e voce colocaria somente as informações necessarias em suas respectivas tabelas...

bom é um sugestão...

ficaria algo mais ou menos assim... e voce nao precisaria mais usar herança;...

public class Documento{ 
@ManyToOne
	private Pessoa pessoa;
}

public class Pessoa{

	@OneToMany(mappedBy = "documento")
	private List<Documento> listDocumento;

         @OneToOne
         private Fisica fisica;

         @OneToOne
        private Juridica juridica;

}

public class Juridica{
    @OneToOne
    private Pessoa pessoa;

}


public class Fisica{
     @OneToOne
    private Pessoa pessoa;

}
R

Acho que não cara, daí eu perderia os beneficios da herança. Analisando aqui, acho que vou utilizar um InheritanceType.JOINED. Usei isso em outro projeto e acho que vai atender mais ou menos. De qualquer forma obrigado aew. Se alguem ai tiver alguma outra ideia…

D

bom achei isso para vc divirta-se =)

http://altieresm.wordpress.com/2011/07/09/implementando-heranca-com-hibernate/

e com o que vc queria =)

abraços

R

Blza, mas isso ai eu implementei, só que a ultima opção…
Daí a minha dúvida é como fazer a chave estrangeira de uma outra tabela para a pessoa. Veja que no ultimo exemplo são duas tabelas diferentes, entendeu?

T

A classe Pessoa é aonde tem a herança certo?
e em qual classe você quer chamar a classe Pessoa?
já sabe o tipo de relacionamento entre essas classes?

Criado 11 de junho de 2012
Ultima resposta 12 de jun. de 2012
Respostas 9
Participantes 3