Herança com Hibernate e annotations

8 respostas
F

Olá senhores,

estou com um problema em uma herança de pessoa para PF e PJ, já tentei arrumar de diversas formas mas nada parece dar certo.

classe pessoa:

@Entity
@Table(name="pessoa",schema="public")
@Inheritance(strategy = InheritanceType.JOINED)
public class Pessoa  implements java.io.Serializable {
    
    private static final long serialVersionUID = 1L;


     private Integer idpessoa;
     private Endereco endereco;
     private Contato contato;
     private String nome;
     private boolean ativo;
     private TipoPessoaEnum tipoPessoa;

    
     private Set usuarios = new HashSet(0);

    public Pessoa() {
    }

	
    public Pessoa(Integer idpessoa, String nome, boolean ativo, TipoPessoaEnum tipoPessoa) {
        this.idpessoa = idpessoa;
        this.nome = nome;
        this.ativo = ativo;
        this.tipoPessoa = tipoPessoa;
    }
    public Pessoa(Integer idpessoa, Endereco endereco, Contato contato, String nome, boolean ativo, Set usuarios,  TipoPessoaEnum tipoPessoa) {
       this.idpessoa = idpessoa;
       this.endereco = endereco;
       this.contato = contato;
       this.nome = nome;
       this.ativo = ativo;
       this.usuarios = usuarios;
       this.tipoPessoa = tipoPessoa;
    }
   
    @SequenceGenerator(name = "pessoa_idpessoa_seq", sequenceName = "public.pessoa_idpessoa_seq", allocationSize = 1, initialValue = 1)
    @Id    
    @Column(name="idpessoa", unique=true, nullable=false)
    @GeneratedValue(generator="pessoa_idpessoa_seq")
    public Integer getIdpessoa() {
        return this.idpessoa;
    }
    
    public void setIdpessoa(Integer idpessoa) {
        this.idpessoa = idpessoa;
    }
    
    @ManyToOne(cascade= CascadeType.ALL,fetch=FetchType.LAZY)
    @JoinColumn(name="idendereco")
    public Endereco getEndereco() {
        return this.endereco;
    }
    
    public void setEndereco(Endereco endereco) {
        this.endereco = endereco;
    }
    
    @ManyToOne(cascade= CascadeType.ALL,fetch=FetchType.LAZY)
    @JoinColumn(name="idcontato")
    public Contato getContato() {
        return this.contato;
    }
    
    public void setContato(Contato contato) {
        this.contato = contato;
    }
    
    @Column(name="nome", nullable=false, length=100)
    public String getNome() {
        return this.nome;
    }
    
    public void setNome(String nome) {
        this.nome = nome;
    }
    
    @Column(name = "tppessoa", nullable = false, length = 1)   
    @Enumerated(EnumType.STRING)
    public TipoPessoaEnum getTipoPessoa() {
        return tipoPessoa;
    }

    public void setTipoPessoa(TipoPessoaEnum tipoPessoa) {
        this.tipoPessoa = tipoPessoa;
    }
    
    @Column(name="ativo", nullable=false)
    public boolean isAtivo() {
        return this.ativo;
    }
    
    public void setAtivo(boolean ativo) {
        this.ativo = ativo;
    }
    
    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="pessoa", targetEntity=Usuario.class)
    public Set getUsuarios() {
        return this.usuarios;
    }
    
    public void setUsuarios(Set usuarios) {
        this.usuarios = usuarios;
    }
}

classe pessoa física:

@Entity
@Table(name="pessoaf",schema="public")
@PrimaryKeyJoinColumn(name = "idpessoaf")
//@Inheritance(strategy = InheritanceType.JOINED)
public class Pessoaf  extends Pessoa {
    private static final long serialVersionUID = 1L;
     
     
     private Escolaridade escolaridade;
     private Pessoaj pessoaj;
     private Estadocivil estadocivil;
     private Conhecimentoevento conhecimentoevento;
     private Cargoocupa cargoocupa;
     private String cpf;
     private String rg;
     private String dsorgaoemissor;
     private Date dtnasicmento;
     private SexoEnum sexo;
     private Set inscricaos = new HashSet(0);

    public Pessoaf() {
        this.setTipoPessoa(TipoPessoaEnum.F);
        this.setEndereco(new Endereco());
    }

	
    public Pessoaf(Escolaridade escolaridade, String cpf, Date dtnasicmento, SexoEnum sexo) {       
       
        this.escolaridade = escolaridade;
        this.cpf = cpf;
        this.dtnasicmento = dtnasicmento;
        this.sexo = sexo;
    }
    public Pessoaf(Escolaridade escolaridade, Pessoaj pessoaj, Estadocivil estadocivil, Conhecimentoevento conhecimentoevento, Cargoocupa cargoocupa, String cpf, String rg, String dsorgaoemissor, Date dtnasicmento, SexoEnum sexo, Set inscricaos) {
              
       this.escolaridade = escolaridade;
       this.pessoaj = pessoaj;
       this.estadocivil = estadocivil;
       this.conhecimentoevento = conhecimentoevento;
       this.cargoocupa = cargoocupa;
       this.cpf = cpf;
       this.rg = rg;
       this.dsorgaoemissor = dsorgaoemissor;
       this.dtnasicmento = dtnasicmento;
       this.sexo = sexo;
       this.inscricaos = inscricaos;
    }
   
  
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="idescolaridade", nullable=false)
    public Escolaridade getEscolaridade() {
        return this.escolaridade;
    }
    
    public void setEscolaridade(Escolaridade escolaridade) {
        this.escolaridade = escolaridade;
    }
    
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="idpessoaj")
    public Pessoaj getPessoaj() {
        return this.pessoaj;
    }
    
    public void setPessoaj(Pessoaj pessoaj) {
        this.pessoaj = pessoaj;
    }
    
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="idestadocivil")
    public Estadocivil getEstadocivil() {
        return this.estadocivil;
    }
    
    public void setEstadocivil(Estadocivil estadocivil) {
        this.estadocivil = estadocivil;
    }
    
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="idconhecimentoevento")
    public Conhecimentoevento getConhecimentoevento() {
        return this.conhecimentoevento;
    }
    
    public void setConhecimentoevento(Conhecimentoevento conhecimentoevento) {
        this.conhecimentoevento = conhecimentoevento;
    }
    
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="idcargoocupa")
    public Cargoocupa getCargoocupa() {
        return this.cargoocupa;
    }
    
    public void setCargoocupa(Cargoocupa cargoocupa) {
        this.cargoocupa = cargoocupa;
    }
    
    @Column(name="cpf", nullable=false, length=11)
    public String getCpf() {
        return this.cpf;
    }
    
    public void setCpf(String cpf) {
        this.cpf = cpf;
    }
    
    @Column(name="rg", length=40)
    public String getRg() {
        return this.rg;
    }
    
    public void setRg(String rg) {
        this.rg = rg;
    }
    
    @Column(name="dsorgaoemissor", length=40)
    public String getDsorgaoemissor() {
        return this.dsorgaoemissor;
    }
    
    public void setDsorgaoemissor(String dsorgaoemissor) {
        this.dsorgaoemissor = dsorgaoemissor;
    }
    
    @Temporal(TemporalType.DATE)
    @Column(name="dtnasicmento", nullable=false, length=13)
    public Date getDtnasicmento() {
        return this.dtnasicmento;
    }
    
    public void setDtnasicmento(Date dtnasicmento) {
        this.dtnasicmento = dtnasicmento;
    }
    
    @Column(name="sexo", nullable=false, length=1)
    @Enumerated(EnumType.STRING)
    public SexoEnum getSexo() {
        return this.sexo;
    }
    
    public void setSexo(SexoEnum sexo) {
        this.sexo = sexo;
    }
    
    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="pessoaf", targetEntity=Inscricao.class)
    public Set getInscricaos() {
        return this.inscricaos;
    }
    
    public void setInscricaos(Set inscricaos) {
        this.inscricaos = inscricaos;
    }

}

classe PessoaFísicaBean:

@ManagedBean(name = "PessoaFisicaBean")
public class PessoaFisicaBean {
    
    private static final long serialVersionUID = 1L;
    private Conecta con;
    private Pessoaf pessoaF;

    public Pessoaf getPessoaF() {
        return pessoaF;
    }

    public void setPessoaF(Pessoaf pessoaF) {
        this.pessoaF = pessoaF;
    }

    public PessoaFisicaBean() {
        con = new Conecta();
        this.setPessoaF(new Pessoaf());      
    }
    
    public static void main(String[] args) {
		
	try {
            Conecta con = new Conecta();
            Escolaridade esc = (Escolaridade) con.getList("from Escolaridade").get(0);
                        
            Pessoaf pessoaF = new Pessoaf();
            pessoaF.setIdpessoa(1);
            pessoaF.setEscolaridade(esc);
            pessoaF.setAtivo(true);
            pessoaF.setEndereco(new Endereco(null, "rua a"));
            
            pessoaF.setCpf("12345978");
            pessoaF.setDsorgaoemissor("ssp");
            pessoaF.setNome("teste");
            pessoaF.setRg("13245678");
            pessoaF.setSexo(SexoEnum.M);
            pessoaF.setDtnasicmento(new Date());
            
            
            
            con.insert(pessoaF);
        } catch (Exception ex) {
            Logger.getLogger(EventoBean.class.getName()).log(Level.SEVERE, null, ex);
        }
	}
        
}

não consigo gravar pessoa física de forma alguma, PJ eu nem tentei ainda, o erro é sempre o mesmo:

Conexão Aberta!
Hibernate: select escolarida0_.idescolaridade as idescola1_16_, escolarida0_.codescolaridade as codescol2_16_, escolarida0_.descricao as descricao16_ from public.escolaridade escolarida0_
Conexão Encerrada!
Conexão Aberta!
Hibernate: select nextval ('public.pessoa_idpessoa_seq')
Hibernate: insert into public.endereco (bairro, cep, complemento, logradouro, idmunicipio, numero) values (?, ?, ?, ?, ?, ?)
Hibernate: insert into public.pessoa (ativo, idcontato, idendereco, nome, tppessoa, idpessoa) values (?, ?, ?, ?, ?, ?)
Hibernate: insert into public.pessoaf (idcargoocupa, idconhecimentoevento, cpf, dsorgaoemissor, dtnasicmento, idescolaridade, idestadocivil, idpessoaj, rg, sexo, idpessoaf) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Nov 08, 2012 3:23:27 PM org.hibernate.util.JDBCExceptionReporter logExceptions
Advertência: SQL Error: 0, SQLState: 23502
Nov 08, 2012 3:23:27 PM org.hibernate.util.JDBCExceptionReporter logExceptions
Grave: ERRO: valor nulo na coluna "idpessoa" viola a restrição não-nula
Generic Persistence -> Erro na inserção :could not insert: [entity.Pessoaf]
Conexão Encerrada!
Nov 08, 2012 3:23:27 PM org.hibernate.event.def.AbstractFlushingEventListener performExecutions
Grave: Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: could not insert: [entity.Pessoaf]
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2267)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2660)
	at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:56)
	at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:250)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:234)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)
	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
	at Util.Conecta.insert(Conecta.java:88)
	at bean.PessoaFisicaBean.main(PessoaFisicaBean.java:62)
Caused by: org.postgresql.util.PSQLException: ERRO: valor nulo na coluna "idpessoa" viola a restrição não-nula
	at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2103)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1836)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:512)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:334)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2250)
	... 10 more

Nov 08, 2012 3:23:27 PM bean.PessoaFisicaBean main
Grave: null
org.hibernate.exception.ConstraintViolationException: could not insert: [entity.Pessoaf]
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2267)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2660)
	at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:56)
	at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:250)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:234)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)
	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
	at Util.Conecta.insert(Conecta.java:88)
	at bean.PessoaFisicaBean.main(PessoaFisicaBean.java:62)
Caused by: org.postgresql.util.PSQLException: ERRO: valor nulo na coluna "idpessoa" viola a restrição não-nula
	at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2103)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1836)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:512)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:334)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2250)
	... 10 more

no banco o id de pessoa é idpessoa, de PF é idpessoaf e de PJ é idpessoaj,

alguém pode me ajudar?

8 Respostas

Hebert_Coelho

Faça como aqui: JPA: Mini Livro - Primeiros passos e conceitos detalhados

F

uma das diferenças que observei foi o @DiscriminatorColumn, pra q serve essa notação?

no meu código, alguma observação?

Hebert_Coelho

uma das diferenças que observei foi o @DiscriminatorColumn, pra q serve essa notação?

no meu código, alguma observação?Tem descrito tudo lá. Existem diversas diferenças. Parei de analisar seu código ao ver @PrimaryKeyJoinColumn(name = “idpessoaf”).

Por falar nisso, não precisa postar esse monte de código. Só a declaração da classe com herança já é suficiente.

F

uma das diferenças que observei foi o @DiscriminatorColumn, pra q serve essa notação?

no meu código, alguma observação?Tem descrito tudo lá. Existem diversas diferenças. Parei de analisar seu código ao ver @PrimaryKeyJoinColumn(name = “idpessoaf”).

Por falar nisso, não precisa postar esse monte de código. Só a declaração da classe com herança já é suficiente.

Cara!

Funcionou! :smiley: Massa!

mas eu gostaria de entender direito o que aconteceu,
o código que eu tava utilizando antes foi recomendado em diversos tópicos.

@Entity
@Table(name="pessoa",schema="public")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "tppessoa")
public abstract class Pessoa  implements java.io.Serializable {
    
    private static final long serialVersionUID = 1L;


     private Integer idpessoa;
     private Endereco endereco;
     private Contato contato;
     private String nome;
     private boolean ativo;
     private TipoPessoaEnum tipoPessoa;

    

    
    @Id    
    @GeneratedValue(strategy= GenerationType.AUTO)
    public Integer getIdpessoa() {
        return this.idpessoa;
    }
    
    public void setIdpessoa(Integer idpessoa) {
        this.idpessoa = idpessoa;
    }
@Entity
@DiscriminatorValue("F")
public class Pessoaf  extends Pessoa {
Hebert_Coelho

Foi mal, mas nos livros que eu li nenhum apontava herança utilizando PrimaryKeyJoinColumn.

Deve ser algo específico do hibernate, não tenho como te explicar.

Do modo como está lá no post, eu sei que funciona pois eu testei todos. ^o^

F

Hebert Coelho:
Foi mal, mas nos livros que eu li nenhum apontava herança utilizando PrimaryKeyJoinColumn.

Deve ser algo específico do hibernate, não tenho como te explicar.

Do modo como está lá no post, eu sei que funciona pois eu testei todos. ^o^

estranho, agora todos os campos de PF e PJ foram criados na tabela de pessoa, no banco!
O.o

Hebert_Coelho

Feijones:
Hebert Coelho:
Foi mal, mas nos livros que eu li nenhum apontava herança utilizando PrimaryKeyJoinColumn.

Deve ser algo específico do hibernate, não tenho como te explicar.

Do modo como está lá no post, eu sei que funciona pois eu testei todos. ^o^

estranho, agora todos os campos de PF e PJ foram criados na tabela de pessoa, no banco!
O.o

Novamente, leia o posto todo. Lá explica o que e como funciona a herança.

F

Hebert Coelho:
Feijones:
Hebert Coelho:
Foi mal, mas nos livros que eu li nenhum apontava herança utilizando PrimaryKeyJoinColumn.

Deve ser algo específico do hibernate, não tenho como te explicar.

Do modo como está lá no post, eu sei que funciona pois eu testei todos. ^o^

estranho, agora todos os campos de PF e PJ foram criados na tabela de pessoa, no banco!
O.o

Novamente, leia o posto todo. Lá explica o que e como funciona a herança.

ai é que tá! porque ele cria todos os campos na tabela pai se os dados não são gravados nela e sim nos filhos?

tentei apagar as colunas criadas não mão grande e o postgres não deixou, “restrição ‘xxxxxxx’ da relação ‘pessoa’ não existe.”

Criado 8 de novembro de 2012
Ultima resposta 8 de nov. de 2012
Respostas 8
Participantes 2