Fórum Primary foreign key (PFK) em JPA #380070
24/06/2010
0
A dúvida é a seguinte: Tenho uma tabela pessoa e uma tabela farmacêutico. Na tabela pessoa o cod_pessoa é auto increment e primary key (PK) e esse mesmo cod_pessoa é Primary foreign key (PFK) em farmacêutico. Quando gero as Entitys pelo netbeans ele não consegue tratar desta forma este relacionamento OneToOne, como tratar essa situação?
//Entidade Pessoapackage bean;
import java.io.Serializable;import javax.persistence.Basic;import javax.persistence.CascadeType;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.Id;import javax.persistence.NamedQueries;import javax.persistence.NamedQuery;import javax.persistence.OneToOne;import javax.persistence.Table;
/** * * @author Rogério */@Entity@Table(name = "pessoa", catalog = "jpapkfk", schema = "public")@NamedQueries({ @NamedQuery(name = "Pessoa.findAll", query = "SELECT p FROM Pessoa p")})public class Pessoa implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "pes_codigo", nullable = false) private Long pesCodigo; @Basic(optional = false) @Column(name = "pes_nome", nullable = false, length = 2147483647) private String pesNome; @OneToOne(cascade = CascadeType.ALL, mappedBy = "pessoa") private Farmaceutico farmaceutico;
public Pessoa() { }
public Pessoa(Long pesCodigo) { this.pesCodigo = pesCodigo; }
public Pessoa(Long pesCodigo, String pesNome) { this.pesCodigo = pesCodigo; this.pesNome = pesNome; }
public Long getPesCodigo() { return pesCodigo; }
public void setPesCodigo(Long pesCodigo) { this.pesCodigo = pesCodigo; }
public String getPesNome() { return pesNome; }
public void setPesNome(String pesNome) { this.pesNome = pesNome; }
public Farmaceutico getFarmaceutico() { return farmaceutico; }
public void setFarmaceutico(Farmaceutico farmaceutico) { this.farmaceutico = farmaceutico; }
@Override public int hashCode() { int hash = 0; hash += (pesCodigo != null ? pesCodigo.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.pesCodigo == null && other.pesCodigo != null) || (this.pesCodigo != null && !this.pesCodigo.equals(other.pesCodigo))) { return false; } return true; }
@Override public String toString() { return "bean.Pessoa[pesCodigo=" + pesCodigo + "]"; }
}//Entidade Farmacêuticopackage bean;
import java.io.Serializable;import javax.persistence.Basic;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.NamedQueries;import javax.persistence.NamedQuery;import javax.persistence.OneToOne;import javax.persistence.Table;
/** * * @author Rogério */@Entity@Table(name = "farmaceutico", catalog = "jpapkfk", schema = "public")@NamedQueries({ @NamedQuery(name = "Farmaceutico.findAll", query = "SELECT f FROM Farmaceutico f")})public class Farmaceutico implements Serializable { private static final long serialVersionUID = 1L; @Id @Basic(optional = false) @Column(name = "pes_codigo", nullable = false) private Long pesCodigo; @Basic(optional = false) @Column(name = "farmo_cro", nullable = false, length = 2147483647) private String farmoCro; @JoinColumn(name = "pes_codigo", referencedColumnName = "pes_codigo", nullable = false, insertable = false, updatable = false) @OneToOne(optional = false) private Pessoa pessoa;
public Farmaceutico() { }
public Farmaceutico(Long pesCodigo) { this.pesCodigo = pesCodigo; }
public Farmaceutico(Long pesCodigo, String farmoCro) { this.pesCodigo = pesCodigo; this.farmoCro = farmoCro; }
public Long getPesCodigo() { return pesCodigo; }
public void setPesCodigo(Long pesCodigo) { this.pesCodigo = pesCodigo; }
public String getFarmoCro() { return farmoCro; }
public void setFarmoCro(String farmoCro) { this.farmoCro = farmoCro; }
public Pessoa getPessoa() { return pessoa; }
public void setPessoa(Pessoa pessoa) { this.pessoa = pessoa; }
@Override public int hashCode() { int hash = 0; hash += (pesCodigo != null ? pesCodigo.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 Farmaceutico)) { return false; } Farmaceutico other = (Farmaceutico) object; if ((this.pesCodigo == null && other.pesCodigo != null) || (this.pesCodigo != null && !this.pesCodigo.equals(other.pesCodigo))) { return false; } return true; }
@Override public String toString() { return "bean.Farmaceutico[pesCodigo=" + pesCodigo + "]"; }
} //Método teste public void salvar() { em = null; try { em = Conexao.getConexao(); pessoa = new Pessoa(); pessoa.setPesNome("Domeneck"); farmaceutico.setFarmoCro("000002"); //Inicia trasação em.getTransaction().begin(); pessoa = em.merge(pessoa); farmaceutico.setPessoa(pessoa); em.merge(farmaceutico); //Finaliza transação em.getTransaction().commit(); JOptionPane.showMessageDialog(null, "Salvo!", "mensagem", JOptionPane.INFORMATION_MESSAGE); } catch (Exception ex) { //Rollback transação em.getTransaction().rollback(); Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } }Rogério Martins
Curtir tópico
+ 0Posts
01/07/2010
Dyego Carmo
Primeiro que eu não recomendaria isto a voce... eu faria algo ao estilo "Heranca de tabelas" no lugar deste OneToOne...
Vai facilitar bastante a sua vida...
Se tiver duvidas , tem um curso chamado "Desvendando o JPA" onde eu ensino como trabalhar com heranca de tabelas.
Gostei + 0
03/07/2010
Andrei Hirata
Olá amigo.Vou te ajudar.....No seu caso é melhor usar heranca..Se vc quizer usar One to one vai ter umas particularidades a mais.
vou te passar um exemplo simples de heranca , caso vc tenha duvida..basta perguntar
Vou te mandar a classe PESSOA que tem todos dados semelhantes para fUNCIONARIOS,fornecedores e clientes
package br.com.sistemaagropecuaria.entity;
import java.io.Serializable;import java.util.Collection;import java.util.Date;import javax.persistence.Basic;import javax.persistence.CascadeType;import javax.persistence.Column;import javax.persistence.DiscriminatorColumn;import javax.persistence.DiscriminatorType;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.JoinColumn;import javax.persistence.JoinTable;import javax.persistence.ManyToMany;import javax.persistence.NamedQueries;import javax.persistence.NamedQuery;import javax.persistence.OneToMany;import javax.persistence.OneToOne;import javax.persistence.Table;import javax.persistence.Temporal;import javax.persistence.TemporalType;
@Entity@Table(name = "pessoas")@NamedQueries({@NamedQuery(name = "Pessoas.findAll", query = "SELECT p FROM Pessoas p"), @NamedQuery(name = "Pessoas.findByIdPessoas", query = "SELECT p FROM Pessoas p WHERE p.idPessoas = :idPessoas"), @NamedQuery(name = "Pessoas.findByNome", query = "SELECT p FROM Pessoas p WHERE p.nome = :nome"), @NamedQuery(name = "Pessoas.findByTipo", query = "SELECT p FROM Pessoas p WHERE p.tipo = :tipo"), @NamedQuery(name = "Pessoas.findByPapel", query = "SELECT p FROM Pessoas p WHERE p.papel = :papel"), @NamedQuery(name = "Pessoas.findByCnpj", query = "SELECT p FROM Pessoas p WHERE p.cnpj = :cnpj"), @NamedQuery(name = "Pessoas.findByInscricaoEstadual", query = "SELECT p FROM Pessoas p WHERE p.inscricaoEstadual = :inscricaoEstadual"), @NamedQuery(name = "Pessoas.findByRazaoSocial", query = "SELECT p FROM Pessoas p WHERE p.razaoSocial = :razaoSocial"), @NamedQuery(name = "Pessoas.findByRg", query = "SELECT p FROM Pessoas p WHERE p.rg = :rg"), @NamedQuery(name = "Pessoas.findByCpf", query = "SELECT p FROM Pessoas p WHERE p.cpf = :cpf"), @NamedQuery(name = "Pessoas.findByDataNascimento", query = "SELECT p FROM Pessoas p WHERE p.dataNascimento = :dataNascimento"), @NamedQuery(name = "Pessoas.findBySexo", query = "SELECT p FROM Pessoas p WHERE p.sexo = :sexo")})@Inheritance(strategy = InheritanceType.JOINED)@DiscriminatorColumn(name = "Papel", discriminatorType = DiscriminatorType.STRING)public class Pessoas implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "idPessoas") private Integer idPessoas; @Basic(optional = false) @Column(name = "Nome") private String nome; @Basic(optional = false) @Column(name = "Tipo") private String tipo; @Basic(optional = false) @Column(name = "Papel") private String papel; @Column(name = "Cnpj") private String cnpj; @Column(name = "InscricaoEstadual") private String inscricaoEstadual; @Column(name = "RazaoSocial") private String razaoSocial; @Column(name = "Rg") private String rg; @Column(name = "Cpf") private String cpf; @Column(name = "Data_Nascimento") @Temporal(TemporalType.DATE) private Date dataNascimento; @Column(name = "Sexo") private String sexo; @JoinTable(name = "pes_fotos", joinColumns = {@JoinColumn(name = "idPessoas", referencedColumnName = "idPessoas")}, inverseJoinColumns = {@JoinColumn(name = "idFotos", referencedColumnName = "idFotos")}) @ManyToMany private Collection<Fotos> fotosCollection; @ManyToMany(mappedBy = "pessoasCollection") private Collection<SysFiliais> sysFiliaisCollection; @OneToOne(cascade = CascadeType.ALL, mappedBy = "pessoas") private PesUsuarios pesUsuarios; @OneToMany(cascade = CascadeType.ALL, mappedBy = "pessoas") private Collection<PesMeioContatos> pesMeioContatosCollection; @OneToMany(cascade = CascadeType.ALL, mappedBy = "pessoas") private Collection<PesEnderecos> pesEnderecosCollection;
public Pessoas() { }
public Pessoas(Integer idPessoas) { this.idPessoas = idPessoas; }
public Pessoas(Integer idPessoas, String nome, String tipo, String papel) { this.idPessoas = idPessoas; this.nome = nome; this.tipo = tipo; this.papel = papel; }
public Integer getIdPessoas() { return idPessoas; }
public void setIdPessoas(Integer idPessoas) { this.idPessoas = idPessoas; }
public String getNome() { return nome; }
public void setNome(String nome) { this.nome = nome; }
public String getTipo() { return tipo; }
public void setTipo(String tipo) { this.tipo = tipo; }
public String getPapel() { return papel; }
public void setPapel(String papel) { this.papel = papel; }
public String getCnpj() { return cnpj; }
public void setCnpj(String cnpj) { this.cnpj = cnpj; }
public String getInscricaoEstadual() { return inscricaoEstadual; }
public void setInscricaoEstadual(String inscricaoEstadual) { this.inscricaoEstadual = inscricaoEstadual; }
public String getRazaoSocial() { return razaoSocial; }
public void setRazaoSocial(String razaoSocial) { this.razaoSocial = razaoSocial; }
public String getRg() { return rg; }
public void setRg(String rg) { this.rg = rg; }
public String getCpf() { return cpf; }
public void setCpf(String cpf) { this.cpf = cpf; }
public Date getDataNascimento() { return dataNascimento; }
public void setDataNascimento(Date dataNascimento) { this.dataNascimento = dataNascimento; }
public String getSexo() { return sexo; }
public void setSexo(String sexo) { this.sexo = sexo; }
public Collection<Fotos> getFotosCollection() { return fotosCollection; }
public void setFotosCollection(Collection<Fotos> fotosCollection) { this.fotosCollection = fotosCollection; }
public Collection<SysFiliais> getSysFiliaisCollection() { return sysFiliaisCollection; }
public void setSysFiliaisCollection(Collection<SysFiliais> sysFiliaisCollection) { this.sysFiliaisCollection = sysFiliaisCollection; }
public PesUsuarios getPesUsuarios() { return pesUsuarios; }
public void setPesUsuarios(PesUsuarios pesUsuarios) { this.pesUsuarios = pesUsuarios; }
public Collection<PesMeioContatos> getPesMeioContatosCollection() { return pesMeioContatosCollection; }
public void setPesMeioContatosCollection(Collection<PesMeioContatos> pesMeioContatosCollection) { this.pesMeioContatosCollection = pesMeioContatosCollection; }
public Collection<PesEnderecos> getPesEnderecosCollection() { return pesEnderecosCollection; }
public void setPesEnderecosCollection(Collection<PesEnderecos> pesEnderecosCollection) { this.pesEnderecosCollection = pesEnderecosCollection; }
@Override public int hashCode() { int hash = 0; hash += (idPessoas != null ? idPessoas.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 Pessoas)) { return false; } Pessoas other = (Pessoas) object; if ((this.idPessoas == null && other.idPessoas != null) || (this.idPessoas != null && !this.idPessoas.equals(other.idPessoas))) { return false; } return true; }
@Override public String toString() { return "br.com.sistemaagropecuaria.entity.Pessoas[idPessoas=" + idPessoas + "]"; }
}
AGORA VOU MANDAR A CLASSE CLIENTE
/* * To change this template, choose Tools | Templates * and open the template in the editor. */
package br.com.sistemaagropecuaria.entity;
import java.io.Serializable;import java.util.Collection;import javax.persistence.CascadeType;import javax.persistence.DiscriminatorValue;import javax.persistence.Entity;import javax.persistence.NamedQueries;import javax.persistence.NamedQuery;import javax.persistence.OneToMany;import javax.persistence.PrimaryKeyJoinColumn;import javax.persistence.Table;
/** * * @author Andrei */@Entity@Table(name = "clientes")@NamedQueries({@NamedQuery(name = "Clientes.findAll", query = "SELECT c FROM Clientes c")})@DiscriminatorValue("Clientes")@PrimaryKeyJoinColumn(name = "idClientes")public class Clientes extends Pessoas implements Serializable { private static final long serialVersionUID = 1L;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "idClientes") private Collection<Vendas> vendasCollection;
public Clientes() { }
public Collection<Vendas> getVendasCollection() { return vendasCollection; }
public void setVendasCollection(Collection<Vendas> vendasCollection) { this.vendasCollection = vendasCollection; }
}
aGORA A CLASSE FORNECEDOR
/* * To change this template, choose Tools | Templates * and open the template in the editor. */
package br.com.sistemaagropecuaria.entity;
import java.io.Serializable;import javax.persistence.DiscriminatorValue;import javax.persistence.Entity;import javax.persistence.NamedQueries;import javax.persistence.NamedQuery;import javax.persistence.PrimaryKeyJoinColumn;import javax.persistence.Table;
/** * * @author Andrei */@Entity@Table(name = "fornecedores")@NamedQueries({@NamedQuery(name = "Fornecedores.findAll", query = "SELECT f FROM Fornecedores f")})@DiscriminatorValue("Fornecedores")@PrimaryKeyJoinColumn(name = "idFornecedores")public class Fornecedores extends Pessoas implements Serializable { private static final long serialVersionUID = 1L;
public Fornecedores() { }
}
Com heranca, basta vc persistir a classe cliente, fornecedor e funcionario que a classe pessoa é persistida para vc automaticamente.
Eu tentei ser o mais direto possivel.se n entendeu...pode perguntar a vontade...abraços
Gostei + 0
09/07/2010
Dyego Carmo
Gostei + 0
22/07/2010
Rogério Martins
//Pessoapackage 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 + "]"; }
}//Pessoa Fisicapackage 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 Chequepackage 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;// }
}Usando as entidades acima consegui refazer funcionar o seguinte exemplo abaixo. Porem ainda tenho algumas dúvidas.
1° Observem os comentários das entidades acima.2° 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? Se sim como eu recuperaria o objeto Pessoa ou PessoaFisica partindo de ClienteCheque?3° Nas classes filhas não existe a necessidade dos métodos equals(), hashCode() e toString()? Se existir como ficariam?
//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(); }}ESTE É O MODELO DO BANCO QUE UTILIZEI PRA FAZER O TESTE (Obs: Isso foi feito só para testes a critério de estudo)
Gostei + 0
28/07/2010
Dyego Carmo
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)