Primary foreign key (PFK) em JPA

5 respostas
josimarsis

Olá galera 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?

5 Respostas

C

Posta um trecho do codigo para ver como que esta, ou ve se sua PFK tbm nao esta auto incremeto…

walacy

http://www.guj.com.br/posts/list/208933.java

josimarsis
//Entidade Pessoa
package 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 josimar
 */
@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 = [telefone removido])
    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êutico
package 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 josimar
 */
@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 = [telefone removido])
    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);
        }
    }
O netbeans me gerou as entidades exatamente desta forma, mais assim eu não consigo trabalhar com a PFK como eu resolveria este problema? Eu dei uma olhada no link que o walacy mandou mais não consegui entender
C

tenta remover a notação…

insertable = false, updatable = false

…do seu classe de entidade de farmaceutico, que ele impede que você possa fazer algo sem modificar na outra table.

josimarsis
certo, eu retirei mais eu necessito colocar alguma anotação especifica que identifique este tipo de relacionamento em farmacêutico ou em pessoa? Pois eu tirei a anotação
insertable = false, updatable = false
como você me disse e deu o seguinte erro:
java.lang.IllegalStateException: Transaction not active
Criado 24 de junho de 2010
Ultima resposta 24 de jun. de 2010
Respostas 5
Participantes 3