JAVAFX com JPA e MySQL

    Há muitos tutoriais, apostilas e vídeos ensinando e passando dicas de como programar em javafx de maneira rápida, simples e até básica demais. Isso ajuda a todos os iniciantes e até quem já programa em java, mas em JPA com conexão em Bancos como MySQL são poucos. 
     Por isso vou iniciar um projeto simples,  para exemplificar de forma padronizada usando o modelo MVC, para que o programa seja de fácil manutenção.
     O projeto será construído usando Netbeans 8.1,  Banco MySQL, JPA e JavaFX. O JDK é o mais recente, no meu caso 1.8.1, o driver do MySQL será usado o da bibioteca no netbeans.

     Vamos começar pelo banco de dados, se você já tem um banco pronto, fica mais fácil para iniciar o projeto, caso contrário crie-o para poder usá-lo. A criação do banco não é o escopo do Blog, mas postarei futuramente sobre o assunto.

    O banco é sobre uma agenda de consultório médico, que possui quatro classes, sendo uma de relacionamento entre elas. As três principais:

  •        Cliente
  •        Técnico
  •        Exame.

      A classe consulta receberá as chaves primárias das classes principais, assim ela será a classe que dará vida ao programa:

  •        Consulta
      
      Abra o NetBeans e crie um novo projeto com aplicacao fxml do javafx, clique em próximo.
     



        Coloque o nome que preferir  no projeto e no FXMDocument, e finalize:

       Após criação do projeto no netbeans, deverá criar os pacotes seguintes: controller, modelo, tela, jpa, principal (controlefx) e dao. Ele deverá ficar parecido com o que segue abaixo.

   
   
          Agora vamos adicionar o driver do MySQL  para conexão do banco e EclipseLink (JPA 2.1)


          Selecione os drivers e adicione-os ao projeto:

          Agora clique o direito do mouse sobre o projeto e selecione classes de entidade do banco..., ou em outros, Persistencia e Classes de entidade do banco, depois em próximo:

     
      Selecione a conexão de banco que você criou e depois selecione as classes em tabelas disponíveis e adicione em tabelas Selecionadas:
                   
     
           Agora verifique os nomes das classes e inclua no pacote modelo, depois clique em finalizar.

          Observação: Após inserir o driver remova o driver EclipseLink-ModelGen da aba processador no item bibliotecas na propriedades do projeto, o netbeans insere automaticamente esta biblioteca no projeto, causando erro ao executar o programa:

       

             Verá que no pacote modelo contêm todas as classes do banco:

               Agora podemos desenvolver o projeto, no pacote jpa clique com o direito do mouse e em novo -> outros -> Persistencia -> Classe do Controlador JPA de Classes de Banco ..., e em próximo. Em seguida adicione todas as classes do banco relacionada ao seu banco:


                  Finalize e verá que o projeto parecera como abaixo:



                   Classes do pacote modelo descritas abaixo:

package modelo;

import java.io.Serializable;
import java.util.List;
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.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

/**
 *
 * @author claudio
 */
@Entity
@Table(name = "tecnicos")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Tecnicos.findAll", query = "SELECT t FROM Tecnicos t"),
    @NamedQuery(name = "Tecnicos.findByTcnId", query = "SELECT t FROM Tecnicos t WHERE t.tcnId = :tcnId"),
    @NamedQuery(name = "Tecnicos.findByTcnNome", query = "SELECT t FROM Tecnicos t WHERE t.tcnNome = :tcnNome"),
    @NamedQuery(name = "Tecnicos.findByTcnFone", query = "SELECT t FROM Tecnicos t WHERE t.tcnFone = :tcnFone"),
    @NamedQuery(name = "Tecnicos.findByTcnEspecialidade", query = "SELECT t FROM Tecnicos t WHERE t.tcnEspecialidade = :tcnEspecialidade")})
public class Tecnicos implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "tcn_id")
    private Integer tcnId;
    @Basic(optional = false)
    @Column(name = "tcn_nome")
    private String tcnNome;
    @Basic(optional = false)
    @Column(name = "tcn_fone")
    private String tcnFone;
    @Basic(optional = false)
    @Column(name = "tcn_especialidade")
    private String tcnEspecialidade;
    @OneToMany(mappedBy = "cnsTecnico")
    private List<Consultas> consultasList;

    public Tecnicos() {
    }

    public Tecnicos(Integer tcnId) {
        this.tcnId = tcnId;
    }

    public Tecnicos(Integer tcnId, String tcnNome, String tcnFone, String tcnEspecialidade) {
        this.tcnId = tcnId;
        this.tcnNome = tcnNome;
        this.tcnFone = tcnFone;
        this.tcnEspecialidade = tcnEspecialidade;
    }

    public Integer getTcnId() {
        return tcnId;
    }

    public void setTcnId(Integer tcnId) {
        this.tcnId = tcnId;
    }

    public String getTcnNome() {
        return tcnNome;
    }

    public void setTcnNome(String tcnNome) {
        this.tcnNome = tcnNome;
    }

    public String getTcnFone() {
        return tcnFone;
    }

    public void setTcnFone(String tcnFone) {
        this.tcnFone = tcnFone;
    }

    public String getTcnEspecialidade() {
        return tcnEspecialidade;
    }

    public void setTcnEspecialidade(String tcnEspecialidade) {
        this.tcnEspecialidade = tcnEspecialidade;
    }

    @XmlTransient
    public List<Consultas> getConsultasList() {
        return consultasList;
    }

    public void setConsultasList(List<Consultas> consultasList) {
        this.consultasList = consultasList;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (tcnId != null ? tcnId.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 Tecnicos)) {
            return false;
        }
        Tecnicos other = (Tecnicos) object;
        if ((this.tcnId == null && other.tcnId != null) || (this.tcnId != null && !this.tcnId.equals(other.tcnId))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return tcnNome + " ";
    }
    
}

package modelo;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
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.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

/**
 *
 * @author claudio
 */
@Entity
@Table(name = "pacientes")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Pacientes.findAll", query = "SELECT p FROM Pacientes p"),
    @NamedQuery(name = "Pacientes.findByPctId", query = "SELECT p FROM Pacientes p WHERE p.pctId = :pctId"),
    @NamedQuery(name = "Pacientes.findByPctNome", query = "SELECT p FROM Pacientes p WHERE p.pctNome = :pctNome"),
    @NamedQuery(name = "Pacientes.findByPctEndereco", query = "SELECT p FROM Pacientes p WHERE p.pctEndereco = :pctEndereco"),
    @NamedQuery(name = "Pacientes.findByPctSexo", query = "SELECT p FROM Pacientes p WHERE p.pctSexo = :pctSexo"),
    @NamedQuery(name = "Pacientes.findByPctFone", query = "SELECT p FROM Pacientes p WHERE p.pctFone = :pctFone"),
    @NamedQuery(name = "Pacientes.findByPctNascimento", query = "SELECT p FROM Pacientes p WHERE p.pctNascimento = :pctNascimento")})
public class Pacientes implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "pct_id")
    private Integer pctId;
    @Basic(optional = false)
    @Column(name = "pct_nome")
    private String pctNome;
    @Basic(optional = false)
    @Column(name = "pct_endereco")
    private String pctEndereco;
    @Basic(optional = false)
    @Column(name = "pct_sexo")
    private String pctSexo;
    @Column(name = "pct_fone")
    private String pctFone;
    @Column(name = "pct_nascimento")
    @Temporal(TemporalType.DATE)
    private Date pctNascimento;
    @OneToMany(mappedBy = "cnsPaciente")
    private List<Consultas> consultasList;

    public Pacientes() {
    }

    public Pacientes(Integer pctId) {
        this.pctId = pctId;
    }

    public Pacientes(Integer pctId, String pctNome,String pctSexo, String pctFone,Date pctNascimento, String pctEndereco) {
        this.pctId = pctId;
        this.pctNome = pctNome;
        this.pctEndereco = pctEndereco;
        this.pctSexo = pctSexo;
        this.pctFone = pctFone;
        consultasList = new ArrayList<>();
    }

    public Integer getPctId() {
        return pctId;
    }

    public void setPctId(Integer pctId) {
        this.pctId = pctId;
    }

    public String getPctNome() {
        return pctNome;
    }

    public void setPctNome(String pctNome) {
        this.pctNome = pctNome;
    }

    public String getPctEndereco() {
        return pctEndereco;
    }

    public void setPctEndereco(String pctEndereco) {
        this.pctEndereco = pctEndereco;
    }

    public String getPctSexo() {
        return pctSexo;
    }

    public void setPctSexo(String pctSexo) {
        this.pctSexo = pctSexo;
    }

    public String getPctFone() {
        return pctFone;
    }

    public void setPctFone(String pctFone) {
        this.pctFone = pctFone;
    }

    public Date getPctNascimento() {
        return pctNascimento;
    }

    public void setPctNascimento(Date pctNascimento) {
        this.pctNascimento = pctNascimento;
    }

    @XmlTransient
    public List<Consultas> getConsultasList() {
        return consultasList;
    }

    public void setConsultasList(List<Consultas> consultasList) {
        this.consultasList = consultasList;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (pctId != null ? pctId.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 Pacientes)) {
            return false;
        }
        Pacientes other = (Pacientes) object;
        if ((this.pctId == null && other.pctId != null) || (this.pctId != null && !this.pctId.equals(other.pctId))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return pctNome;
    }

}

package modelo;

import java.io.Serializable;
import java.util.List;
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.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

/**
 *
 * @author claudio
 */
@Entity
@Table(name = "exames")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Exames.findAll", query = "SELECT e FROM Exames e"),
    @NamedQuery(name = "Exames.findByExmId", query = "SELECT e FROM Exames e WHERE e.exmId = :exmId"),
    @NamedQuery(name = "Exames.findByExmDescricao", query = "SELECT e FROM Exames e WHERE e.exmDescricao = :exmDescricao"),
    @NamedQuery(name = "Exames.findByExmValor", query = "SELECT e FROM Exames e WHERE e.exmValor = :exmValor")})
public class Exames implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "exm_id")
    private Integer exmId;
    @Basic(optional = false)
    @Column(name = "exm_descricao")
    private String exmDescricao;
    // @Max(value=?)  @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation
    @Column(name = "exm_valor")
    private Double exmValor;
    @OneToMany(mappedBy = "cnsExame")
    private List<Consultas> consultasList;

    public Exames() {
    }

    public Exames(Integer exmId) {
        this.exmId = exmId;
    }

    public Exames(Integer exmId, String exmDescricao, Double exmValor) {
        this.exmId = exmId;
        this.exmDescricao = exmDescricao;
        this.exmValor = exmValor;
    }

    public Integer getExmId() {
        return exmId;
    }

    public void setExmId(Integer exmId) {
        this.exmId = exmId;
    }

    public String getExmDescricao() {
        return exmDescricao;
    }

    public void setExmDescricao(String exmDescricao) {
        this.exmDescricao = exmDescricao;
    }

    public Double getExmValor() {
        return exmValor;
    }

    public void setExmValor(Double exmValor) {
        this.exmValor = exmValor;
    }

    @XmlTransient
    public List<Consultas> getConsultasList() {
        return consultasList;
    }

    public void setConsultasList(List<Consultas> consultasList) {
        this.consultasList = consultasList;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (exmId != null ? exmId.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 Exames)) {
            return false;
        }
        Exames other = (Exames) object;
        if ((this.exmId == null && other.exmId != null) || (this.exmId != null && !this.exmId.equals(other.exmId))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return exmDescricao + " ";
    }

}

package modelo;

import java.io.Serializable;
import java.util.Date;
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.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.xml.bind.annotation.XmlRootElement;

/**
 *
 * @author claudio
 */
@Entity
@Table(name = "consultas")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Consultas.findAll", query = "SELECT c FROM Consultas c"),
    @NamedQuery(name = "Consultas.findByCnsId", query = "SELECT c FROM Consultas c WHERE c.cnsId = :cnsId"),
    @NamedQuery(name = "Consultas.findByCnsData", query = "SELECT c FROM Consultas c WHERE c.cnsData = :cnsData"),
    @NamedQuery(name = "Consultas.findByCnsHora", query = "SELECT c FROM Consultas c WHERE c.cnsHora = :cnsHora")})
public class Consultas implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "cns_id")
    private Integer cnsId;
    @Basic(optional = false)
    @Column(name = "cns_data")
    @Temporal(TemporalType.DATE)
    private Date cnsData;
    @Basic(optional = false)
    @Column(name = "cns_hora")
    @Temporal(TemporalType.TIME)
    private Date cnsHora;
    @JoinColumn(name = "cns_paciente", referencedColumnName = "pct_id")
    @ManyToOne
    private Pacientes cnsPaciente;
    @JoinColumn(name = "cns_tecnico", referencedColumnName = "tcn_id")
    @ManyToOne
    private Tecnicos cnsTecnico;
    @JoinColumn(name = "cns_exame", referencedColumnName = "exm_id")
    @ManyToOne
    private Exames cnsExame;

    public Consultas() {
    }

    public Consultas(Integer cnsId) {
        this.cnsId = cnsId;
    }

    public Consultas(Integer cnsId, Date cnsData, Date cnsHora) {
        this.cnsId = cnsId;
        this.cnsData = cnsData;
        this.cnsHora = cnsHora;
        cnsPaciente = new Pacientes(cnsPaciente.getPctId());
        cnsTecnico = new Tecnicos(cnsTecnico.getTcnId());
        cnsExame = new Exames(cnsTecnico.getTcnId());
    }

    public Integer getCnsId() {
        return cnsId;
    }

    public void setCnsId(Integer cnsId) {
        this.cnsId = cnsId;
    }

    public Date getCnsData() {
        return cnsData;
    }

    public void setCnsData(Date cnsData) {
        this.cnsData = cnsData;
    }

    public Date getCnsHora() {
        return cnsHora;
    }

    public void setCnsHora(Date cnsHora) {
        this.cnsHora = cnsHora;
    }

    public Pacientes getCnsPaciente() {
        return cnsPaciente;
    }

    public void setCnsPaciente(Pacientes cnsPaciente) {
        this.cnsPaciente = cnsPaciente;
    }

    public Tecnicos getCnsTecnico() {
        return cnsTecnico;
    }

    public void setCnsTecnico(Tecnicos cnsTecnico) {
        this.cnsTecnico = cnsTecnico;
    }

    public Exames getCnsExame() {
        return cnsExame;
    }

    public void setCnsExame(Exames cnsExame) {
        this.cnsExame = cnsExame;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (cnsId != null ? cnsId.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 Consultas)) {
            return false;
        }
        Consultas other = (Consultas) object;
        if ((this.cnsId == null && other.cnsId != null) || (this.cnsId != null && !this.cnsId.equals(other.cnsId))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "modelo.Consultas[ cnsId=" + cnsId + " ]";
    }

}

Comentários