Problema com @ManyToOne em mapeamento de super classe

6 respostas
andre_guitar7

Boa noite, pessoal.

Digamos que eu tenha uma classe PessoaFisica e PessoaJuridica e essas extendem de Pessoa. Digamos que eu tenha outra classe que possui um atributo do tipo pessoa. O mapeamento ficaria ssim:

@Entity public class ClasseQueTemPessoa { @ManyToOne private Pessoa p; }

PessoaFisica e PessoaJuridica estão devidamente mapeadas utilizando @Entity. Já a classe Pessoa está utilizando @MappedSuperclass. O problema é que na hora de criar as tabelas automaticamente, dispara o seguinte erro:

Eu realmente não mapeei a classe Pessoa, porque ela é abstrata.

Como poderia resolver essa situação?

Obrigado!

6 Respostas

Hebert_Coelho

Esse post mostra como fazer mapeamento de herança, explica o que é e como utilizar o MappedSuperclass: JPA: Mini Livro - Primeiros passos e conceitos detalhados.

O erro que você está tendo está falando que Pessoa não é uma entidade e se for mapeado com MappedSuperclass ela não será uma entidade. Leia o post e entenda como funciona. [=

G

Fala André,
eu fiz um exemplo aqui e funcionou perfeitamente. Acredito que seja isso… olha como o Hibernate gerou:

Hibernate: 
    alter table PJ 
        drop 
        foreign key FK_Cargo_PJ_IDCargo
Hibernate: 
    drop table if exists Cargo
Hibernate: 
    drop table if exists PF
Hibernate: 
    drop table if exists PJ
Hibernate: 
    create table Cargo (
        IDCargo integer not null auto_increment,
        Cargo varchar(255),
        primary key (IDCargo)
    )
Hibernate: 
    create table PF (
        IDPessoa integer not null auto_increment,
        nome varchar(255),
        CPF integer,
        CargoID integer,
        primary key (IDPessoa)
    )
Hibernate: 
    create table PJ (
        IDPessoa integer not null auto_increment,
        nome varchar(255),
        CNPJ integer,
        CargoID integer,
        primary key (IDPessoa)
    )
Hibernate: 
    alter table PF 
        add index FK_Cargo_PF_IDCargo (CargoID), 
        add constraint FK_Cargo_PF_IDCargo 
        foreign key (CargoID) 
        references Cargo (IDCargo)
Hibernate: 
    alter table PJ 
        add index FK_Cargo_PJ_IDCargo (CargoID), 
        add constraint FK_Cargo_PJ_IDCargo 
        foreign key (CargoID) 
        references Cargo (IDCargo)

Da uma olhada nas classes:

@MappedSuperclass
public class Pessoa {
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "IDPessoa")
	private Integer idPessoa;
	@Column
	private String nome;

@Entity
@Table(name = "PJ")
public class PessoaJuridica extends Pessoa {
	@Column(name = "CNPJ")
	private Integer cnpj;
	@ManyToOne
	@JoinColumn(name = "CargoID")
	@ForeignKey(name = "FK_Cargo_PJ_IDCargo")
	private Cargo cargo;

@Entity
@Table(name = "PF")
public class PessoaFisica extends Pessoa {
	@Column(name = "CPF")
	private Integer cpf;
	@ManyToOne
	@JoinColumn(name = "CargoID")
	@ForeignKey(name = "FK_Cargo_PF_IDCargo")
	private Cargo cargo;

@Table
@Entity
public class Cargo {
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "IDCargo")
	private Integer IdCargo;
	@Column(name = "Cargo")
	private String nomeCargo;
	@OneToMany(mappedBy = "cargo")
	private Set<PessoaFisica> pessoaFisicas = new HashSet<PessoaFisica>();
	@OneToMany(mappedBy = "cargo")
	private Set<PessoaJuridica> pessoaJuridicas = new HashSet<PessoaJuridica>();

Ve se é isso mesmo!!

Abraços

Hebert_Coelho

GustavoSS, do modo como você fez funciona pois você não relacionou pessoa na classe cargo, mas sim PJ ou PF. [=

andre_guitar7

Hebert Coelho:
Esse post mostra como fazer mapeamento de herança, explica o que é e como utilizar o MappedSuperclass: JPA: Mini Livro - Primeiros passos e conceitos detalhados.

O erro que você está tendo está falando que Pessoa não é uma entidade e se for mapeado com MappedSuperclass ela não será uma entidade. Leia o post e entenda como funciona. [=

Então para que funcione, a classe pessoa tem que ser mapeada como entidade?

Hebert_Coelho

andre_guitar7:
Hebert Coelho:
Esse post mostra como fazer mapeamento de herança, explica o que é e como utilizar o MappedSuperclass: JPA: Mini Livro - Primeiros passos e conceitos detalhados.

O erro que você está tendo está falando que Pessoa não é uma entidade e se for mapeado com MappedSuperclass ela não será uma entidade. Leia o post e entenda como funciona. [=

Então para que funcione, a classe pessoa tem que ser mapeada como entidade?

Você leu o post? Lá explica. [=

andre_guitar7

Hebert Coelho:
andre_guitar7:
Hebert Coelho:
Esse post mostra como fazer mapeamento de herança, explica o que é e como utilizar o MappedSuperclass: JPA: Mini Livro - Primeiros passos e conceitos detalhados.

O erro que você está tendo está falando que Pessoa não é uma entidade e se for mapeado com MappedSuperclass ela não será uma entidade. Leia o post e entenda como funciona. [=

Então para que funcione, a classe pessoa tem que ser mapeada como entidade?

Você leu o post? Lá explica. [=

Ok, obrigado, Hebert.

Criado 3 de novembro de 2012
Ultima resposta 3 de nov. de 2012
Respostas 6
Participantes 3