Auxílio para implementar o cadastro de Cliente que pode ser PessoaFisica ou PessoaJuridica

Java

30/05/2015

Oi, pessoal, estou precisando de ajuda para resolver o seguinte problema:

- Estou desenvolvendo (utilizando JPA, JSF e PrimeFaces) alguns cadastros (ex: cliente) onde estou utilizando Herança e Composição para implementar o relacionamento das seguintes classes:
1 - Pessoa (abstrata)
2 - PessoaFisica e PessoaJuridica (herdam de Pessoa)
3 - Cliente (possui um atributo de Pessoa, uma vez que pode ser tanto PessoaFisica ou PessoaJuridica)

- A princípio defini na classe Cliente um atributo tipoDePessa, que é um enum composto por FISICA e JURIDICA, onde a ideia é: vincular os valores deste enum a um "p:selectOneRadio" para que dependendo do tipo que for selecionado (FISICO ou JURIDICO) instanciar o objeto Pessoa como PessoaFisica ou PessoaJuridica.

- Andei estudando o evento "onchange" para ser utilizado na vinculação de um método que verifique o tipo selecionado e então faça a instanciação, porém não consegui (não sei como fazer) como passar os dados selecionados na página xhtm para o Bean.

Agradeço se puderem me auxiliar na forma de como instanciar um objeto Pessoa dependendo do tipo que for selecionado, ou caso esta não seja a melhor solução, qual seria uma outra e como implementá-la.

- Abaixo estão as classes implementas:

1- Pessoa:

@Entity
@Table(name = "PESSOAS")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "PESS_TIPO")
public abstract class Pessoa implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "PESS_CODIGO", nullable = false)
private Integer codigo;

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

@Enumerated(EnumType.STRING)
@Column(name = "PESS_TIPO_PESSOA", nullable = false)
private PessoaType tipoPessoa;

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

@OneToOne(mappedBy = "pessoa")
private Endereco endereco;

@Column(name = "PESS_OBSERVACAO", length = 255, nullable = true)
private String observacao;

@Column(name = "PESS_STATUS", length = 1, nullable = false)
private Boolean status;

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "PESS_DATA_CADASTRO", nullable = false)
private Date dataCadastro;

@Version
@Column(name = "PESS_DATA_ALTERACAO", nullable = false)
private Timestamp dataAlteracao;

protected Pessoa() {

}

protected Pessoa(Integer codigo, String nome String telefone, Endereco endereco,
String observacao, Boolean status, Date dataCadastro, Timestamp dataAlteracao) {
this.codigo = codigo;
this.nome = nome;
this.telefone = telefone;
this.endereco = endereco;
this.observacao = observacao;
this.status = status;
this.dataCadastro = dataCadastro;
this.dataAlteracao = dataAlteracao;
}

/* Getters e Setters

}



2- Pessoa Física:

@Entity
@Table(name = "PESSOA_FISICA")
@DiscriminatorValue(value = "PF")
@PrimaryKeyJoinColumn(name = "PESS_CODIGO")
public class PessoaFisica extends Pessoa implements Serializable {

private static final long serialVersionUID = 1L;

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

@Column(name = "PESF_RG", length = 14, nullable = false)
private String rg;

@Column(name = "PESF_ORGAO_EMISSOR_RG", length = 20, nullable = false)
private String orgaoEmissorRg;

@Column(name = "PESF_EMAIL", length = 65, nullable = true)
private String email;

@Column(name = "PESF_CELULAR", length = 14, nullable = true)
private String celular;

@Lob
@Column(name = "PESF_FOTO", nullable = true)
private byte[] foto;

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

@Enumerated(EnumType.STRING)
@Column(name = "PESF_SEXO", nullable = false)
private SexoType sexo;

@OneToMany(mappedBy = "cliente")
private List<PedidoVenda> pedidos;

public PessoaFisica() {

}

public PessoaFisica(String cpf, String rg, String orgaoEmissorRg, String email, String celular, byte[] foto,
Date dataNascimento, SexoType sexo) {
this.cpf = cpf;
this.rg = rg;
this.orgaoEmissorRg = orgaoEmissorRg;
this.email = email;
this.celular = celular;
this.foto = foto;
this.dataNascimento = dataNascimento;
this.sexo = sexo;
}

/* Getters e Setters
}



3- Peessoa Jurídica

@Entity
@Table(name = "PESSOA_JURIDICA")
@DiscriminatorValue(value = "PJ")
@PrimaryKeyJoinColumn(name = "PESS_CODIGO")
public class PessoaJuridica extends Pessoa implements Serializable {

private static final long serialVersionUID = 1L;

@Column(name = "PESJ_NOME_FANTASIA", length = 100, nullable = false)
private String nomeFantasia;

/* 00.000.000/0001-00
@Column(name = "PESJ_CNPJ", length = 14, nullable = false)
private String cnpj;

@Column(name = "PESJ_INSCRICAO_ESTADUAL", length = 15, nullable = false)
private String inscricaoEstadual;

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

@Column(name = "PESJ_INSCRICAO_MUNICIPAL", length = 15, nullable = true)
private String inscricaoMunicipal;

@Column(name = "PESJ_HOME_PAGE", length = 100, nullable = true)
private String homePage;

@Column(name = "PESJ_FAX", length = 15, nullable = true)
private String fax;

public PessoaJuridica() {

}

public PessoaJuridica(String nomeFantasia, String cnpj, String inscricaoEstadual, Date validadeInscricaoEstadual,
String inscricaoMunicipal, String homePage, String fax) {
this.nomeFantasia = nomeFantasia;
this.cnpj = cnpj;
this.inscricaoEstadual = inscricaoEstadual;
this.validadeInscricaoEstadual = validadeInscricaoEstadual;
this.inscricaoMunicipal = inscricaoMunicipal;
this.homePage = homePage;
this.fax = fax;
}

/* Getters e Setters
}


4- Cliente

@Entity
@Table(name = "CLIENTES")
public class Cliente implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "CLIE_CODIGO", nullable = false)
private Integer codigo;

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "PESS_CODIGO", nullable = false)
private Pessoa pessoa;

@Enumerated(EnumType.STRING)
@Column(name = "CLIE_TIPO_PESSOA", nullable = false)
private PessoaType tipoPessoa;

public Cliente() {

}

public Cliente(Integer codigo, Pessoa pessoa, PessoaType tipoPessoa) {
this.codigo = codigo;
this.pessoa = pessoa;
this.tipoPessoa = tipoPessoa;
}

/* Getters e Setters
}
Marcelo

Marcelo

Curtidas 0

Respostas

Marcelo

Marcelo

30/05/2015

----
GOSTEI 0
Marcelo

Marcelo

30/05/2015

--- .
GOSTEI 0
POSTAR