Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Porque o EntityManager.find(...) tem q colocar a extensão .class no argumento?

No exemplo do professor abaixo, ele usa Conta.class como argumento do método find. Porque precisa da extensão .class? Isso foge ao padrão dos códigos ensinados até agora. Outra dúvida: fui pesquisar na documentação de JPA e o método find é apresenta assim: <T> T find(Class<T> entityClass, Object primaryKey). Como se lê isso?

public static void main(String[] args) {

    EntityManager em = new JPAUtil().getEntityManager();
    em.getTransaction().begin();

    Conta conta = em.find(Conta.class, 1);


    em.getTransaction().commit();
}
4 respostas

Boa noite, Daniel! Como vai?

O método find() recebe um parâmetro .class pra saber qual entidade está sendo buscada. No caso do seu exemplo, é um dado da entidade Conta. Já sobre a segunda pergunta, a leitura é "método find parametrizado para um tipo T, retorna um tipo T e recebe como parâmetro um um objeto do tipo Class e um outro do tipo Object".

Pegou a ideia? Qualquer coisa é só falar!

Grande abraço e bons estudos, meu aluno!

Oi Gabriel, boa noite.

Estou seguindo a Formação Java e cheguei a esse ponto sem terem explicado essas coisas que sua explicação pressupõe que eu saberia. Então peço desculpa pela insistência/desconhecimento, mas como não explicaram como pré-requisito deste curso, teria como vc explicar com um pouco mais de detalhe?

Qdo vc diz: "O método find() recebe um parâmetro .class pra saber qual entidade está sendo buscada.", eu não entendi porque tem que ser Conta.class ao invés de Conta sem a extensão que é como venho programando até aqui. Qual a diferença de Conta para Conta.class?

O que é um "método parametrizado para um tipo T"? E o que seria um "objeto do tipo Class"?

Desde já agradeço. Se houver alguma aula na alura que explique esses conceitos e quiser indicar eu assistirei, pois vejo que há uma lacuna no meu aprendizado.

solução!

Opa, Daniel! Claro que posso explicar com mais detalhes!

Qdo vc diz: "O método find() recebe um parâmetro .class pra saber qual entidade está sendo buscada.", eu não entendi porque tem que ser Conta.class ao invés de Conta sem a extensão que é como venho programando até aqui. Qual a diferença de Conta para Conta.class?

Conta representa um tipo enquanto Conta.class retorna um objeto contendo informações sobre a classe em questão. Esse objeto é um instância da classe Class.

O que é um "método parametrizado para um tipo T"?

Uma classe pode ser parametrizada através de generics. Por exemplo, quando criamos uma lista de strings fazemos List<String> lista = new ArrayList<>(). Veja que entre o sinal de maior e menor eu parametrizei a lista dizendo que ela será uma lista de strings. Ou seja, a interface List é uma interface parametrizável e isso a permite saber com que tipo de informação ela trabalha. O mesmo ocorre com a classe Class do Java, pois ela é uma classe parametrizável.

E o que seria um "objeto do tipo Class"?

A classe Class é uma classe muito especial no Java! Ela faz parte do pacote de reflection do Java e seus objetos tem o poder de representarem qualquer classe contendo suas informações como atributos, métodos, construtores, etc.

Por fim, há dois cursos aqui na Alura sobre esse tema de reflexão em Java os quais eu mesmo ministro. Mas esse é um assunto muito complexo o qual eu não indico a você nesse momento, afinal de contas haverá diversas informações nesses cursos que não são necessárias para a continuação desse curso que vc está fazendo agora.

Pegou a ideia? Qualquer coisa é só falar!

Grande abraço e bons estudos, meu aluno!

Entendi perfeitamente. Ótima explicação. Muito obrigado.