Método findbyid Hibernate Jpa para diferentes classes

Boa tarde pessoal,

Sou novo em desenvolvimento e estou fazendo um CRUD simples utlizando jpa e hibernate. O problema é o seguinte, se eu instanciar os objetos, tanto o entityManager quanto a classe que vou persistir, na classe main e executar o método, o código funciona perfeitamente, como no exemplo:

EntityManager entityManager = jpautil.getEntityManagerFactory().createEntityManager();
entityManager.getTransaction().begin();
cliente d = new cliente();
d.setId(2);
d = entityManager.find(cliente.class, d.getId());
entityManager.getTransaction().commit();
entityManager.close();
jpautil.shutdown();

System.out.println();
System.out.println();
System.out.println("Código do cliente: "+ d.getId());
System.out.println("Nome do cliente: "+ d.getNome());
System.out.println("CPF do cliente: "+ d.getCpf());
System.out.println();
System.out.println();

No entanto, eu gostaria de direcionar toda essa parte do entityManager
para uma classe DAO, deixando no main apenas a instancia da classe cliente e criar um método localizaporid dentro da classe cliente, ficando da seguinte forma:

Classe DAO:

public Classe_generica findbyid (Classe_generia.class, int id){ EntityManager entityManager = jpautil.getEntityManagerFactory().createEntityManager(); entityManager.getTransaction().begin(); Classe_generica cg = new Classe_generica(); cg = entityManager.find(Classe_generica.class, id); entityManager.getTransaction().commit(); entityManager.close(); jpautil.shutdown(); return cg; }

Sabendo que criamos o método “localizaporid” dentro da classe cliente e este
chama o método “findbyId” da classe DAO, no main ficaria:

cliente d = new cliente(); d.setId(2); d = d.localizaporid(cliente.class, cliente.getId());

A grande jogada, é que gostaria de repetir isso para diversas classes utilizando
essa mesma lógica, onde uma classe de fornecedores também teria o método “localizaporid”, chamando findbyid da classe DAO.

Obrigado!

Quando você trabalha com Hibernate (JPA) ou outra implementação, é comum o uso de uma classe que torna os métodos comuns (persistir, listar, pesquisar por id, editar e excluir, basicamente) genéricos para todas as possíveis entidades de um projeto.
Neste caso, a classe pode ser abstrata e todos os DAOs estendem dela:

public abstract class GenericDAO<E, ID extends Serializable> {
     public E findById(Class<?> clazz, ID id) {
          return (E) entityManager.find(clazz, id);
     }
}
1 curtida

Muito Obrigado Darlan!

Vou implementar e dar o retorno à vocês.

Grato!