15
respostas

Duvida com esse código

public class DAO<T> { // O porque  do "<T>" OQUE seria?


    private final Class<T> classe; 
    //Aqui seria um atributo do tipo Class? Mais e esse <T>?

    public DAO(Class<T> classe) { 
    //Esse construtor aqui? Minha duvida é sempre o <T> 
        this.classe = classe;
    }
15 respostas

Opa Alisson,

Tem uma resposta muito boa de Adriano aqui nesse post => https://cursos.alura.com.br/forum/topico-generics-no-dao-por-que-24287

Alberto deixa eu ve se eu entendi, no momento estou confuso, deixa ver se eu entendi. a ClassDAO recebe um T e esse T não roda em tempo de execução, ele está ali para receber o tipo de "Class" que voce passar? e depois criamos uma variavel do tipo class para guardar o endereço? e depois um construtor e nele voce passa a classe desejada e instacia um objeto do tipo da classe desejada? por exemplo tenho uma Classe livro, e depois vo criar um teste para ela.

    DAO<Livro> dao = new DAO<Livro>
aqui todos que eram o meu T passo a ser uma Classe do tipo Livro?
E no meu atributo 
 private final Class<T> classe; e depois no construtor
public DAO(Class<T> classe) {
    this.classe = classe;
}
Agora tudo que passe como <Livro> substituiu o meu T?
E depois no construtor eu criei uma instancia que viro um objeto do tipo Livro?

Depois do construtor, vc armazena um objeto do tipo Class como atributo do DAO, vc não tem uma instância do tipo Livro. E sim, quando vc faz DAO<Livro>, vc meio que está informando que para aquela variável o T é igual Livro. O que Adriano mostra no outro post é que essa informação só vale para tempo de compilação.

Alberto na alura teria um curso com esse tipo de abordagem? queria apreender mais sobre esse assunto. Pois ainda fiquei confuso. Desde já obrigado

Não temos um curso focado nisso, tenta dar uma olhada na documentação da própria oracle => https://docs.oracle.com/javase/tutorial/java/generics/types.html

Alberto então qualquer coisa que for adicionar ao banco vai ter essa logica de código?

public class DAO<T> { 
 private final Class<T> classe; 
    public DAO(Class<T> classe) { 
       this.classe = classe;
    }

Todas classe que eu for connectar com banco vo usar esse tipo de DAO?

Opa Alisson, não necessariamente. Essa foi uma abordagem do curso de usar um dao básico para varias operações... Você pode seguir ela e utilizar nos seus projetos, mas, em geral, você sempre vai ter os daos específicos com as operações específicas daquela entidade.

Entendi mano, por exemplo Alberto poderia se eu tivesse uma Classe do tipo Cliente certo? depois ia ter uma ClienteBean correto? e nesse ClienteBean iria ter um metodo por exemplo salvarCliente cadastrar algo genérico correto? e Depois iria ter um DAO, melhorando um pacote DAO, e teria uma Classe DAO tbm dentro do pacote, nesse DAO queria ter um metodo que adiciona/transação com o bando de dados, faria ele pelo mananger.perse(); algo assim é que agora não estou com o meu notebook, eu teria que crirar um novo Cliente dentro do meu manager? como eu setaria essa classe para adicionar ao banco? obs fazendo isso com uma pagina html.

Opa, isso é justamente o que é mostrado durante o curso. Acho que é só ir para frente nele e fazer os exercícios.

Curso de JSF com hibernate e primefaces? eles dão um projeto para baixar, queria saber uma outra coisa Alberto kkk

Oque que estou errando que não esta adicionando no banco? :(


import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Cliente {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private Integer idade;
    private double peso;
    private String nome;

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public Integer getIdade() {
        return idade;
    }
    public void setIdade(Integer idade) {
        this.idade = idade;
    }
    public double getPeso() {
        return peso;
    }
    public void setPeso(double peso) {
        this.peso = peso;
    }
    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }
}
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import br.com.bercalini.DAO.DAO;
import br.com.bercalini.nutricao.modelo.Cliente;

@ManagedBean

public class ClienteBean {

    private Cliente cliente = new Cliente();

    public void adicionar() {
        new DAO<Cliente>(Cliente.class).adicionar(cliente);
    }
    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }


}
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class JPAUtil {

    private static EntityManagerFactory emf = Persistence.createEntityManagerFactory("nutricao");

    public EntityManager geEntityManager() {
        EntityManager manager = emf.createEntityManager();
        return manager;
    }
}
import javax.persistence.EntityManager;

public class DAO<T> {

    private final Class<T> classe;

    public DAO(Class<T> classe) {
        this.classe = classe;
    }

    public void adicionar(T t) {
        EntityManager em = new JPAUtil().geEntityManager();
        em.getTransaction().begin();
        em.persist(t);
        em.getTransaction().commit();
        em.close();
    }
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/html">
<body>
    <form>
        <h3>Cadastro de cliente</h3>
        <f:panelGrid columns="2">
            <f:outputLabel value="Nome:" for="nome" />
            <f:inputText id="nome"  value="#{clienteBean.cliente.nome}"/>
            <f:outputLabel value="Idade:" for="idade" />
            <f:inputText id="idade" value="#{clienteBean.cliente.idade}"/>
            <f:outputLabel value="Peso:" for="peso" />
            <f:inputText id="peso"  value="#{clienteBean.cliente.peso}"/>
        </f:panelGrid>
        <f:commandButton value="Salvar" action="#{clienteBean.adicionar}"/>
    </form>
</body>
</html>

Porque não esta adicionando? :(

Não vi nada de errado.. o que acontece? chega no método do managed bean? da exception?

Não quando clico no botao salvar não aparece nada no console, oque sera que pode ser?

O engraçado que nem quando eu mudo uma coisa no meu xhtml ele da erro por exemplo

<f:commandButton value="Salvar" action="#{ClienteBean.adicionar}"/>

com o C maisculo e mesmo nao da erro e nao continua aparecendo nada quando clico no salvar

Alberto agora rodou e adicionou no banco. obrigado!