Persistência de dados

Olá pessoal,

Estou iniciando em um novo projeto na minha empresa e irei trabalhar com alguns padrões já implantados, só que até o momento eu não tinha conhecimento dos mesmo e visualizando o código tive algumas dúvidas em questão de como eles estão tratando a comunicação com o BD através do java.

Olhando o código abaixo, percebi que as buscas de dados nos BD são feitas através das entidades, sem que haja a necessidade de se criar uma query em sql, essa minha dedução foi certa?

Se realmente for dessa forma que eu entendi, seria possível fazer dessa forma a busca e o cruzamento de dados de 2 ou mais bancos de dados diferentes utilizando esse mesmo padrão?

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.**.cima.entity;

import entidade.SuperLogicLocal;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;

/**
 *
 * @author 
 */
@Entity
@Table(name = "Incidencia")
@XmlRootElement
public class Incidencia extends SuperLogicLocal implements Serializable {

    @Basic(optional = false)
    @NotNull
    @Temporal(TemporalType.TIMESTAMP)
    private Date dataIncidencia;
    @Basic(optional = false)
    @NotNull
    @Size(max = 254)
    private String nomeUsuario;
    @Basic(optional = false)
    @NotNull
    @Size(max = 254)
    private String email;
    @Temporal(TemporalType.TIMESTAMP)
    private Date elaboracaoRel;
    @Size(max = 20)
    @Column(length = 20)
    private String telefone;
    @Size(max = 20)
    @Column(length = 20)
    @Basic(optional = false)
    @NotNull
    private String numIncidencia;
    @Size(max = 20)
    @Column(length = 20)
    private String unidade;
    private Boolean recebimento;
    private Boolean transporte;
    private Boolean operacao;
    private Boolean instalacao;
    private Boolean outro;
    @Size(max = 254)
    private String outroDescricao;
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "incidencia", orphanRemoval = true)
    private List<IncidenciaMaterial> incidenciaMaterials;
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "incidencia", orphanRemoval = true)
    private List<IncidenciaEmpreiteira> incidenciaEmpreiteiras;
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "incidencia", orphanRemoval = true)
    private List<Defeito> defeitos;
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "incidencia", orphanRemoval = true)
    private List<AnaliseFinal> analiseFinals;

    public Date getDataIncidencia() {
        if (dataIncidencia == null) {
            dataIncidencia = new Date();
        }
        return dataIncidencia;
    }

    public void setDataIncidencia(Date dataIncidencia) {
        this.dataIncidencia = dataIncidencia;
    }

    public String getNomeUsuario() {
        return nomeUsuario;
    }

    public void setNomeUsuario(String nomeUsuario) {
        this.nomeUsuario = nomeUsuario;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Date getElaboracaoRel() {
        return elaboracaoRel;
    }

    public void setElaboracaoRel(Date elaboracaoRel) {
        this.elaboracaoRel = elaboracaoRel;
    }

    public String getTelefone() {
        return telefone;
    }

    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }

    public String getNumIncidencia() {
        return numIncidencia;
    }

    public void setNumIncidencia(String numIncidencia) {
        this.numIncidencia = numIncidencia;
    }

    public String getUnidade() {
        return unidade;
    }

    public void setUnidade(String unidade) {
        this.unidade = unidade;
    }

    public Boolean getRecebimento() {
        return recebimento;
    }

    public void setRecebimento(Boolean recebimento) {
        this.recebimento = recebimento;
    }

    public Boolean getTransporte() {
        return transporte;
    }

    public void setTransporte(Boolean transporte) {
        this.transporte = transporte;
    }

    public Boolean getOperacao() {
        return operacao;
    }

    public void setOperacao(Boolean operacao) {
        this.operacao = operacao;
    }

    public Boolean getInstalacao() {
        return instalacao;
    }

    public void setInstalacao(Boolean instalacao) {
        this.instalacao = instalacao;
    }

    public Boolean getOutro() {
        return outro;
    }

    public void setOutro(Boolean outro) {
        this.outro = outro;
    }

    public String getOutroDescricao() {
        return outroDescricao;
    }

    public void setOutroDescricao(String outroDescricao) {
        this.outroDescricao = outroDescricao;
    }

    public List<IncidenciaMaterial> getIncidenciaMaterials() {
        if (incidenciaMaterials == null) {
            incidenciaMaterials = new ArrayList<>();
        }
        return incidenciaMaterials;
    }

    public void setIncidenciaMaterials(List<IncidenciaMaterial> incidenciaMaterials) {
        this.incidenciaMaterials = incidenciaMaterials;
    }

    public List<IncidenciaEmpreiteira> getIncidenciaEmpreiteiras() {
        if(incidenciaEmpreiteiras == null){
            incidenciaEmpreiteiras = new ArrayList<>();
        }
        return incidenciaEmpreiteiras;
    }

    public void setIncidenciaEmpreiteiras(List<IncidenciaEmpreiteira> incidenciaEmpreiteiras) {
        this.incidenciaEmpreiteiras = incidenciaEmpreiteiras;
    }

    public List<Defeito> getDefeitos() {
        if(defeitos == null){
            defeitos = new ArrayList<>();
        }
        return defeitos;
    }

    public void setDefeitos(List<Defeito> defeitos) {
        this.defeitos = defeitos;
    }

    public List<AnaliseFinal> getAnaliseFinals() {
        if(analiseFinals == null){
            analiseFinals = new ArrayList<>();
        }
        return analiseFinals;
    }

    public void setAnaliseFinals(List<AnaliseFinal> analiseFinals) {
        this.analiseFinals = analiseFinals;
    }

    @Override
    public int hashCode() {
        int hash = *;
        hash = ** * hash + Objects.hashCode(this.dataIncidencia);
        hash = ** * hash + Objects.hashCode(this.nomeUsuario);
        hash = ** * hash + Objects.hashCode(this.email);
        hash = ** * hash + Objects.hashCode(this.elaboracaoRel);
        hash = ** * hash + Objects.hashCode(this.telefone);
        hash = ** * hash + Objects.hashCode(this.numIncidencia);
        hash = ** * hash + Objects.hashCode(this.unidade);
        hash = ** * hash + Objects.hashCode(this.recebimento);
        hash = ** * hash + Objects.hashCode(this.transporte);
        hash = ** * hash + Objects.hashCode(this.operacao);
        hash = ** * hash + Objects.hashCode(this.instalacao);
        hash = ** * hash + Objects.hashCode(this.outro);
        hash = ** * hash + Objects.hashCode(this.outroDescricao);
        
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Incidencia other = (Incidencia) obj;
        if (!Objects.equals(this.nomeUsuario, other.nomeUsuario)) {
            return false;
        }
        if (!Objects.equals(this.email, other.email)) {
            return false;
        }
        if (!Objects.equals(this.telefone, other.telefone)) {
            return false;
        }
        if (!Objects.equals(this.numIncidencia, other.numIncidencia)) {
            return false;
        }
        if (!Objects.equals(this.unidade, other.unidade)) {
            return false;
        }
        if (!Objects.equals(this.outroDescricao, other.outroDescricao)) {
            return false;
        }
        if (!Objects.equals(this.dataIncidencia, other.dataIncidencia)) {
            return false;
        }
        if (!Objects.equals(this.elaboracaoRel, other.elaboracaoRel)) {
            return false;
        }
        if (!Objects.equals(this.recebimento, other.recebimento)) {
            return false;
        }
        if (!Objects.equals(this.transporte, other.transporte)) {
            return false;
        }
        if (!Objects.equals(this.operacao, other.operacao)) {
            return false;
        }
        if (!Objects.equals(this.instalacao, other.instalacao)) {
            return false;
        }
        if (!Objects.equals(this.outro, other.outro)) {
            return false;
        }
        return true;
    }

}

Ps: Onde tem ** foi substituído apenas por questão de privacidade.

Boa tarde!

Sim, mas, não basta mapear as entidades, criar os relacionamentos entre elas e pronto.

Os critérios de ligação que servem para isso são:

@OneToMany
@ManyToMany
@ManyToOne

Estude sobre persistencia, JPA e/ou Hibernate para se embasar e siga em frente!

Apesar de ser algo novo eu entendi essa parte, mas a falta do SQL me faz pensar que dependendo do que se quer fica um pouco limitado somente com isso…

É possível utilizar dessa forma para coisas mais complexas? No caso como eu havia dito, buscar em dois bancos de dados diferentes por uma mesma entidade e fazer com que os dados tenham o cruzamento de informações? (Eu sei que dá pra fazer isso com codificação dentro da aplicação, mas eu queria de forma que fosse passado pro BD fazer e retornar tudo pronto como eu conseguiria no SQL)

Que zona esse código, entidade toda poluída. Mas alguém está te proibindo de usar SQL? É muito mais prático e eficiente escrever SQL diretamente.

1 curtida

Se vc quer escrever seu SQL “customizado”, utilize o comando NativeQuery do Hibernate ou OpenJPA e assim, vc vai conseguir o que pretende.

Exemplo:

1 curtida

Eu também concordo que é mais eficiente e mais pratico usar o SQL, mas eles seguem esse padrão em todas as aplicações e eu teria que seguir também.

Eu já utilizei o hibernate e sei como funciona, mas como eu disse, eu tenho que seguir esse padrão de ir direto da entidade, isso está sendo um problema…

É um padrão bem burro, coisa de arquiteto que faz padrao pra CRUD simples e não participa no dia a dia do projeto. Nunca trabalhei em um projeto com Hibernate que fosse engessado assim. Sao várias opções de query que o próprio hibernate deixa em aberto: HQL, Criteria e diretamente via SQL.

Bom, cara, apela na magia, combo e depois dá um Super Death Blow com (baixo + frente) 2X -> bolinha e triangulo e já era!

Quero ver se vc não mata esse arquiteto de meia tigela!

Zueiras à parte, estou num projeto que, acredite, é todo em JDBC que o cliente desenvolveu e não é permitido utilizar nada de DB fora isso, sob a pena de não iniciar o projeto e ainda levar um “baita puxão de orelhas”.

Mas aí, vida que segue. Preciso continuar levando o leite para meus filhos. Não tenho poderes para mudar isso.

Só qdo o Messias do Java passar por aqui pra catequizar os fariseus…

É bem melhor do que o cenário dele. Com JDBC puro você pode criar biblioteca ou gerador de código pra o que for repetitivo, ninguém nem vai saber. E você ganha toda praticidade do SQL.

2 curtidas

Sim, eu já pensei em uma forma de “burlar” essa regra, vou deixar apenas os CRUD e o mais necessário na aplicação e vou utilizar uma ferramenta de geração de relatórios que aceita SQL direto no relatório e fazer por lá.

1 curtida