Criar uma classe DAO genérica com o @PersistenceContext é uma boa prática, ou o ideal é que cada classe EJB tenha o seu @PersistenceContext
Ex:
public abstract class DAO implements Serializable {
@PersistenceContext
private EntityManager em;
public EntityManager getEm() {
return em;
}
public <T> T carregar(Object key, Class<T> clazz) {
return em.find(clazz, key);
}
public <T> void salvar(T entity) {
em.persist(entity);
}
public <T> void alterar(T entity) {
em.merge(entity);
}
public <T> void excluir(T entity) {
em.remove(entity);
}
protected Query criarQuery(String query) {
return em.createQuery(query);
}
protected Query criarQueryNativa(String query, Object key) {
return em.createNativeQuery(query);
}
}
public class PessoaFisicaDAO extends DAO {
public PessoaFisica existeCPF(String cpf, Integer pessoaId) {
String query = "SELECT p FROM PessoaFisica p WHERE p.cpf = '" + cpf + "'";
Query q = criarQuery(query);
List list = q.getResultList();
if (list.size() > 0) {
return (PessoaFisica) list.get(0);
} else {
return null;
}
}
}
@Stateless
public class PessoaFisicaService {
@Inject
private PessoaFisicaDAO dao;
public void salvar(Pessoa pessoa) throws ValidacaoException {
dao.salvar(pessoaFisica);
}
}