Caros minha classe LivroDataModel não está executando. Gera o erro de Lazy loading:
public class LivroDataModel extends LazyDataModel<Livro> {
private static final long serialVersionUID = 1L;
@Inject
private LivroDao livroDao;
@PostConstruct
void init(){
super.setRowCount(livroDao.contaTodos());
}
@Override
public List<Livro> load(int first, int pageSize, List<SortMeta> multiSortMeta, Map<String, Object> filters) {
List<String> colunas = new ArrayList<String>();
List<String> valores = new ArrayList<String>();
for (Entry<String, Object> entry : filters.entrySet()) {
colunas.add(entry.getKey());
valores.add(entry.getValue().toString());
}
return this.livroDao.listaTodosPaginada(first, pageSize, colunas, valores);
}
}
LivroDao
public class LivroDao implements Serializable {
private static final long serialVersionUID = -6662277994148943606L;
private DAO<Livro> dao;
public int contaTodos() {
return dao.contaTodos();
}
public List<Livro> listaTodosPaginada(int firstResult, int maxResults, List<String> colunas, List<String> valores) {
return dao.listaTodosPaginada(firstResult, maxResults, colunas, valores);
}
@Inject
private EntityManager entityManager;
@PostConstruct
public void init() {
this.dao = new DAO<Livro>(entityManager, Livro.class);
}
public void adiciona(Livro t) {
dao.adiciona(t);
}
public void remove(Livro t) {
dao.remove(t);
}
public void atualiza(Livro t) {
dao.atualiza(t);
}
public List<Livro> listaTodos() {
return dao.listaTodos();
}
public Livro buscaPorId(Integer id) {
return dao.buscaPorId(id);
}
DAO
public class DAO<T> implements Serializable {
private final Class<T> classe;
private EntityManager em;
public DAO(EntityManager entityManager, Class<T> classe) {
this.em = entityManager;
this.classe = classe;
}
public void adiciona(T t) {
// abre transacao
em.getTransaction().begin();
// persiste o objeto
em.persist(t);
// commita a transacao
em.getTransaction().commit();
}
public void remove(T t) {
em.getTransaction().begin();
em.remove(em.merge(t));
em.getTransaction().commit();
}
public void atualiza(T t) {
em.getTransaction().begin();
em.merge(t);
em.getTransaction().commit();
}
public List<T> listaTodos() {
CriteriaQuery<T> query = em.getCriteriaBuilder().createQuery(classe);
query.select(query.from(classe));
List<T> lista = em.createQuery(query).getResultList();
return lista;
}
public T buscaPorId(Integer id) {
T instancia = em.find(classe, id);
return instancia;
}
public int contaTodos() {
long result = (Long) em.createQuery("select count(n) from " + classe.getSimpleName() + " n")
.getSingleResult();
return (int) result;
}
public List<T> listaTodosPaginada(int firstResult, int maxResults) {
CriteriaQuery<T> query = em.getCriteriaBuilder().createQuery(classe);
query.select(query.from(classe));
List<T> lista = em.createQuery(query).setFirstResult(firstResult)
.setMaxResults(maxResults).getResultList();
return lista;
}
public List<T> listaTodosPaginada(int firstResult, int maxResults, List<String> colunas, List<String> valores) {
CriteriaQuery<T> query = em.getCriteriaBuilder().createQuery(classe);
Root<T> root = query.from(classe);
if(valores != null && !valores.isEmpty() && colunas != null && !colunas.isEmpty() && colunas.size() == valores.size()) {
List<Predicate> predicates = new ArrayList<Predicate>();
for (int i = 0; i < colunas.size(); i++) {
predicates.add(em.getCriteriaBuilder().like(root.<String>get(colunas.get(i)), valores.get(i) + "%"));
}
query = query.where(predicates.toArray(new Predicate[predicates.size()]));
}
List<T> lista = em.createQuery(query).setFirstResult(firstResult).setMaxResults(maxResults).getResultList();
return lista;
}
}
Poderiam dar uma ajuda nesse tópico? Não estou conseguindo fazer funcionar com o CDI.