[RESOLVIDO] Herança em JPA

1 resposta
josimarsis

Galera estou estudando Herança no JPA e depois de muita pesquisa no amigo google[img] consegui fazer o seguinte exemplo abaixo: Porém ainda tenho algumas dúvidas.
para entenderem a minha dúvida observem os comentários dos mapeamentos das entidades persistentes.

1° Utilizando herança no JPA eu devo desprezar as anotações de relacionamento? Pois não consegui fazer funcionar com elas!
Se não como ficaria a inserção na classe de teste (Classe Main)? Se sim como eu recuperaria o objeto Pessoa ou PessoaFisica partindo de ClienteCheque?
2° Nas classes filhas não existe a necessidade dos métodos equals(), hashCode() e toString()? Se existir como ficariam?
3º Existem algo a mais que eu deveria saber?

//Pessoa
package entity;

import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;

@Entity
@Table(name = "pessoa", catalog = "teste_jpa_4", schema = "public")
//Observe
@Inheritance(strategy = InheritanceType.JOINED)
public class Pessoa implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "pes_cod_pessoa", nullable = false)
    private Long pesCodPessoa;
    @Basic(optional = false)
    @Column(name = "pes_nome", nullable = false, length = [telefone removido])
    private String pesNome;


//    @OneToOne(cascade = CascadeType.ALL, mappedBy = "pessoa")
//    private PessoaFisica pessoaFisica;

    public Pessoa() {
    }

    public Pessoa(Long pesCodPessoa) {
        this.pesCodPessoa = pesCodPessoa;
    }

    public Pessoa(Long pesCodPessoa, String pesNome) {
        this.pesCodPessoa = pesCodPessoa;
        this.pesNome = pesNome;
    }

    public Long getPesCodPessoa() {
        return pesCodPessoa;
    }

    public void setPesCodPessoa(Long pesCodPessoa) {
        this.pesCodPessoa = pesCodPessoa;
    }

    public String getPesNome() {
        return pesNome;
    }

    public void setPesNome(String pesNome) {
        this.pesNome = pesNome;
    }

//    public PessoaFisica getPessoaFisica() {
//        return pessoaFisica;
//    }
//
//    public void setPessoaFisica(PessoaFisica pessoaFisica) {
//        this.pessoaFisica = pessoaFisica;
//    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (pesCodPessoa != null ? pesCodPessoa.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Pessoa)) {
            return false;
        }
        Pessoa other = (Pessoa) object;
        if ((this.pesCodPessoa == null && other.pesCodPessoa != null) || (this.pesCodPessoa != null && !this.pesCodPessoa.equals(other.pesCodPessoa))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "entity.Pessoa[pesCodPessoa=" + pesCodPessoa + "]";
    }

}
//Pessoa Fisica
package entity;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;

@Entity
@Table(name = "pessoa_fisica", catalog = "teste_jpa_4", schema = "public")
//Observe
@PrimaryKeyJoinColumn(name = "pes_cod_pessoa")
public class PessoaFisica extends Pessoa implements Serializable {
    private static final long serialVersionUID = 1L;

    @Column(name = "pf_cpf", length = 14)
    private String pfCpf;


//    @JoinColumn(name = "pes_cod_pessoa", referencedColumnName = "pes_cod_pessoa", nullable = false, insertable = false, updatable = false)
//    @OneToOne(optional = false)
//    private Pessoa pessoa;
//    @OneToOne(cascade = CascadeType.ALL, mappedBy = "pessoaFisica")
//    private ClienteCheque clienteCheque;

    public PessoaFisica() {
    }

    public String getPfCpf() {
        return pfCpf;
    }

    public void setPfCpf(String pfCpf) {
        this.pfCpf = pfCpf;
    }

//    public Pessoa getPessoa() {
//        return pessoa;
//    }
//
//    public void setPessoa(Pessoa pessoa) {
//        this.pessoa = pessoa;
//    }
//
//    public ClienteCheque getClienteCheque() {
//        return clienteCheque;
//    }
//
//    public void setClienteCheque(ClienteCheque clienteCheque) {
//        this.clienteCheque = clienteCheque;
//    }
}
//Cliente Cheque
package entity;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table(name = "cliente_cheque", catalog = "teste_jpa_4", schema = "public")
//Observe
@PrimaryKeyJoinColumn(name = "pes_cod_pessoa")
public class ClienteCheque extends PessoaFisica implements Serializable {
    private static final long serialVersionUID = 1L;

    @Basic(optional = false)
    @Column(name = "cc_data_cadastro", nullable = false)
    @Temporal(TemporalType.TIMESTAMP)
    private Date ccDataCadastro;
    @Column(name = "controle")
    private Integer controle;

//    @JoinColumn(name = "pes_cod_pessoa", referencedColumnName = "pes_cod_pessoa", nullable = false, insertable = false, updatable = false)
//    @OneToOne(optional = false)
//    private PessoaFisica pessoaFisica;

    public ClienteCheque() {
    }

    public Date getCcDataCadastro() {
        return ccDataCadastro;
    }

    public void setCcDataCadastro(Date ccDataCadastro) {
        this.ccDataCadastro = ccDataCadastro;
    }

    public Integer getControle() {
        return controle;
    }

    public void setControle(Integer controle) {
        this.controle = controle;
    }

//    @Override
//    public PessoaFisica getPessoaFisica() {
//        return pessoaFisica;
//    }
//
//    @Override
//    public void setPessoaFisica(PessoaFisica pessoaFisica) {
//        this.pessoaFisica = pessoaFisica;
//    }

}
//Classe Principal (Para testes)
package view;

import entity.ClienteCheque;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.EntityManager;
import javax.swing.JOptionPane;
import persistence.Conexao;
import persistence.DatabaseException;

public class Main {

    private ClienteCheque clienteCheque = new ClienteCheque();
    private EntityManager manager;

    public Main() {

        salvar();
    }

    public void salvar() {

        try {
            manager = Conexao.getConexao();
            manager.getTransaction().begin();

            clienteCheque.setPesNome("Rogerio");
            clienteCheque.setPfCpf("[CPF removido]");
            clienteCheque.setCcDataCadastro(new Date());
            clienteCheque.setControle(1);

            manager.merge(clienteCheque);


            manager.getTransaction().commit();
            JOptionPane.showMessageDialog(null, "Salvou!");
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "Não Salvou! " + DatabaseException.findLastException(ex));
            manager.getTransaction().rollback();
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static void main(String jo[]) {
        new Main();
    }
}

1 Resposta

josimarsis

Galera fazendo vários testes e lendo vários outros artigos na internet e como ninguém respondeu o post eu mesmo me propus a responder-lo,
com base no que entendi dos testes e dos artigos que li.

Obs: Lembrando que o exemplo acima funciona!

1º Utilizando herança no JPA eu não preciso das anotações de relacionamento! Para recuperar os dados seria normal: Ex:

select p from Pessoa p //(Todas as pessoas) select pf from PessoaFisica pf //(Todas as pessoas que são pessoas físicas) select cc from ClienteCheque //(Todas as pessoas físicas que são clientes cheque)
2° Não existe a necessidade!
3° Se existe algo que preciso saber ainda não descobri.

Criado 22 de julho de 2010
Ultima resposta 26 de jul. de 2010
Respostas 1
Participantes 1