[RESOLVIDO] Herança em JPA

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?

[code]//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 = 2147483647)
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 + "]";
}

}[/code]

[code]
//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;
// }
}[/code]

[code]//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;
// }

}[/code]

[code]//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("222.222.222-22");
        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();
}

}[/code]

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.