Dúvida sobre o método find do EntityManager fj21

Não encontrei uma resposta muito objetiva na internet então resolvi pergutar para os esperts. No Cap. 14 da apostila fj-21da Caelum tem um exemplo do método find do JPA ontem eles usam um L no argumentom mas não explica o porque. Sem esse L meu código não funciona e com ele roda certinho. Alguém poderia me explicar esse mistério??? Desde já agradeço!

Segue o código.

EntityManagerFactory factory = Persistence.createEntityManagerFactory("tarefas");
EntityManager manager = factory.createEntityManager();

Tarefa encontrada = manager.find(Tarefa.class, 1L);

System.out.println(encontrada.getDescricao());

Este é método de conversão de valores bem antigo que ainda é muito utilizado, o método find provavelmente pede um tipo Long como argumento e se você colocar um número qualquer o compilador do java vai entende-lo como um integer, colocando a letra L o compilador entende esse mesmo número como um tipo Long.

1 curtida

O segundo parâmetro do método find é um Object correspondente à chave primária do objeto que você quer procurar.

Se você invocar dessa forma: manager.find(Tarefa.class, 1); o auto boxing vai converter o seu 1, que é um literat int, para um objeto do tipo Integer mas no seu banco de dados a chave primária está mapeada como sendo um objeto do tipo Long.

Diferente de int e long, Integer e Long não são tipos primitivos, são classes e não há relação de herança entre elas, se você tentar atribuir um Integer para uma variável Long ou vice-versa, vai acontecer ClassCastException.

Agora se você invocar dessa forma: manager.find(Tarefa.class, 1L); o auto boxing vai converter o seu 1L, que é um literal long, para um objeto do tipo Long que é o que está mapeado na sua tabela, por isso funciona.

2 curtidas