PessoaDao() estendendo PessoaFisica e PessoaJuridica Hibernate

Bom dia senhores…

estou com um problema…

Estou aumentando meu projeto, antes ele cadastrava usuários sem distinguir, pessoa física de pessoa jurídica, agora criei as seguintes classes e mapeei no hibernate:

Pessoa:

[code]package com.aquaRj.model.cadastro;

import java.io.Serializable;
import javax.persistence.*;

package com.aquaRj.model.cadastro;

import java.io.Serializable;
import javax.persistence.*;

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name=“tipo”)
@SequenceGenerator(name = “codpessoa”, sequenceName = “pessoa_codpessoa_seq”, allocationSize = 1, initialValue = 100000)
public abstract class Pessoa implements Serializable {
private static final long serialVersionUID = 1000L;

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "codpessoa") 
@Column(name="codpessoa")
private long codPessoa;

@Column(name="nome", length=50, nullable=false)
private String nome;

@Column(name="tipoeessoa", length=14, nullable=false)
private String tipoPessoa;

@ManyToOne
@JoinColumn(name = "codendereco")
private Endereco endereco;

@ManyToOne
@JoinColumn(name = "codtelefone")
private Telefone telefone;[/code]

PessoaFisica

[code]package com.aquaRj.model.cadastro;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.*;

@Entity
@DiscriminatorValue(“pessoaFisica”)
@Table(name=“pessoafisica”)
public class PessoaFisica extends Pessoa implements Serializable {
private static final long serialVersionUID = 1000L;

@Id
@Column(name="cpf", length=14, nullable=false, unique=true)
private String cpf;

@Temporal(TemporalType.DATE)
@Column(name="datanascimento", nullable=false)
private Date datanascimento;

@Column(name="sexo", length=1, nullable=false)
private char sexo;[/code]

PessoaJuridica:

[code]package com.aquaRj.model.cadastro;

import java.io.Serializable;
import javax.persistence.*;

@Entity
@DiscriminatorValue(“pessoaJuridica”)
@Table(name=“pessoajuridica”)
public class PessoaJuridica extends Pessoa implements Serializable{
private static final long serialVersionUID = 1000L;

@Id
@Column(name="cnpj", length=18, nullable=false, unique=true)
private String cnpj;

@Column(name="razaosocial", length=50, nullable=false)
private String razaoSocial;	

@Column(name="nomefantasia", length=50, nullable=false)
private String nomeFantasia;

@Column(name="inscricaoestadual", length=10, nullable=false)
private String inscricaoEstadual;[/code]

Endereco:

[code]package com.aquaRj.model.cadastro;

import java.io.Serializable;
import javax.persistence.;
import java.util.
;

@Entity
@Table(name=“endereco”)
@SequenceGenerator(name = “codendereco”, sequenceName = “endereco_codendereco_seq”, allocationSize = 1, initialValue = 100000)
public class Endereco implements Serializable {
private static final long serialVersionUID = 1000L;

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "codendereco") 
@Column(name="codendereco")
private long codendereco;
	
@OneToMany(mappedBy="endereco") 
private List<Pessoa> pessoa;

@Column(name="tipo", length=1, nullable=false)
private char tipo;

@Column(name="logradouro", length=60, nullable=false)
private String logradouro;

@Column(name="numero", nullable=false)
private Integer numero;

@Column(name="bairro", length=30, nullable=false)
private String bairro;

@Column(name="cidade", length=40, nullable=false)
private String cidade;

@Column(name="estado", length=40, nullable=false)
private String estado;

@Column(name="cep", length=9, nullable=false)
private String cep;[/code]

Telefone:

[code]package com.aquaRj.model.cadastro;

import java.io.Serializable;
import java.util.List;

import javax.persistence.*;

@Entity
@Table(name=“telefone”)
@SequenceGenerator(name = “codtelefone”, sequenceName = “telefone_codtelefone_seq”, allocationSize = 1, initialValue = 100000)
public class Telefone implements Serializable{
private static final long serialVersionUID = 1000L;

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "codtelefone") 
@Column(name="codtelefone")
private long codtelefone;

@OneToMany(mappedBy="telefone") 
private List<Pessoa> pessoa;

@Column(name="telefone", length=9, nullable=false)
private String telefone;

@Column(name="celular", length=9, nullable=false)
private String celular;[/code]

Conta:

[code]package com.aquaRj.model.cadastro;

import java.io.Serializable;
import javax.persistence.*;

@Entity
@Table(name=“conta”)
@SequenceGenerator(name = “codconta”, sequenceName = “conta_codconta_seq”, allocationSize = 1, initialValue = 100000)
public class Conta implements Serializable{
private static final long serialVersionUID = 1000L;

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "codconta") 
@Column(name="codconta")
private long codconta;

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "codpessoa")
private Pessoa pessoa;

@Column(name="email", length=40, nullable=false, unique=true)
private String email;

@Column(name="senha", nullable=false)
private String senha;[/code]

Bom… eu tenho tb o PessoaDao:

[code]package com.aquaRj.persistence;

import org.hibernate.;
import com.aquaRj.hibernate.HibernateUtil;
import com.aquaRj.model.cadastro.
;

public class PessoaDao {

protected Session s;
protected Transaction t;
protected Query q;

public void salvar(Pessoa pessoa) throws Exception {
	s = HibernateUtil.getInstance();
	t = s.beginTransaction();
	s.save(pessoa);
	t.commit();
}

public void excluir(Pessoa pessoa) throws Exception {
	s = HibernateUtil.getInstance();
	t = s.beginTransaction();
	s.delete(pessoa);
	t.commit();
}

public void atualizar(Pessoa pessoa) throws Exception {
	s = HibernateUtil.getInstance();
	t = s.beginTransaction();
	s.update(pessoa);
	t.commit();
}

public Pessoa obterPorId(long codPessoa) throws Exception {
	s = HibernateUtil.getInstance();
	return (Pessoa) s.get(Pessoa.class, codPessoa);
}

public Conta autenticar(String login, String senha) {
	q = s.createQuery("from Conta cont where cont.email = :lg and cont.senha = :md5(sen)");
	q.setString("lg", login);
	q.setString("sen", senha);
	return (Conta)q.uniqueResult();
}

public boolean cpfExistente(String cpf) throws Exception {
	boolean valid = false;
	s = HibernateUtil.getInstance();
	q = s.createQuery("from PessoaFisica pf where p.cpf = :cpf");
	q.setString("cpf", cpf);
	String cpfExistente = (String) q.uniqueResult();
	if (cpfExistente != null) {
		valid = true;
	}
	return valid;
}

public boolean cnpjExistente(String cnpj) throws Exception {
	boolean valid = false;
	s = HibernateUtil.getInstance();
	q = s.createQuery("from PessoaJuridica pj where pj.cnpj = :cnpj");
	q.setString("cnpj", cnpj);
	String cnpjExistente = (String) q.uniqueResult();
	if (cnpjExistente != null) {
		valid = true;
	}
	return valid;
}

}[/code]

Esse ultimo (PessoaDao), eu tinha montado para salvar o usuário que não distinguia PessoaFisica de PessoaJuridica (Era uma classe pessoa com todos os atributos dentro, não estendia, não tinha relacionamento entre endereço, telefone e conta…) o problema é que não sei como montar esse Dao para salvar “Pessoa” dessa nova forma que fiz…

Alguem pode me ajudar??