0

As I read in the PrimeFaces showcase, a converter is needed for my autoComplete to work, so I did as follows:

<p:autoComplete id="ListaInst"
    emptyMessage="Nenhuma instituição encontrada."
    value="#{InstituicaoController.inst1}"
    completeMethod="#{InstituicaoController.getInstituicoesLike}"
    var="i"
    itemLabel="#{i.inst_nome}"
    itemValue="#{i}"
    converter="instituicaoConverter"
    required="true"
    style="width: 200px;font-family: monospace; font-size: 14px; margin-top: 4px;" />

The managed bean method:

public Collection<Instituicao> getInstituicoesLike(String searchKeyword) {
    InstituicaoDao dao = new InstituicaoDao();
    Collection<Instituicao> instituicoes = dao.getInstituicoesLike(searchKeyword);
    return instituicoes;
}

The DAO method:

public Collection<Instituicao> getInstituicoesLike(String searchKeyword) {
    Session ss = HibernateUtil.getSessionFactory().getCurrentSession();
    try {
        ss.beginTransaction();
        List instituicoes = ss.createCriteria(Instituicao.class).add(Restrictions.like("inst_nome", searchKeyword)).list();
        ss.beginTransaction().commit();
        ss.close();
        ss.clear();
        return instituicoes;
    } catch(HibernateException e) {
        ss.getTransaction().rollback();
        ss.close();
        ss.clear();
    }
    return null;
}

I know it's better to use JTA, JPA 2.1, JSF 2.2, EJB 3.1 and Hibernate 4.3.4 (and it worked perfectly using these), but I don't know if it would be acceptable in the project I'm working on. Narrow minded developers don't want to "learn everything again" and think code like this.manager.persist(entity) is worse than that boilerplate above.

P.S.: Converter code:

package br.com.solidaria.converters;

import br.com.solidaria.dao.InstituicaoDao;
import br.com.solidaria.model.Instituicao;

import javax.faces.component.*;
import javax.faces.context.*;
import javax.faces.convert.*;

/**
 *
 * @author Rodrigo Sieja Bertin
 */
@FacesConverter(forClass = Instituicao.class, value = "instituicaoConverter")
public class InstituicaoConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        InstituicaoDao dao = new InstituicaoDao();
        Instituicao i = InstituicaoDao.getById(Integer.parseInt(value));
        return i;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
    Instituicao i = (Instituicao) value;
        return String.valueOf(i.getId());
    }
}
Luiggi Mendoza
  • 85,076
  • 16
  • 154
  • 332
Rasshu
  • 1,764
  • 6
  • 22
  • 53
  • 2
    What's your exact problem? – Luiggi Mendoza Mar 21 '14 at 17:09
  • Autocomplete can't find anything – Rasshu Mar 21 '14 at 17:24
  • javax.el.ELException: /cadAcao.xhtml @84,122 value="#{AcaoController.listUserRH}": org.hibernate.TransactionException: nested transactions not supported – Rasshu Mar 21 '14 at 17:35
  • In your DAO method you begin the transaction twice. – Aritz Mar 22 '14 at 09:40
  • Changed beginTransaction().commit() to getTransaction().commit() and TransactionException is gone; then changed getCurrentSession() to openSession() and get rid of SessionException; finally, changed the query line to List instituicoes = ss.createCriteria(Instituicao.class).add(Restrictions.like("inst_nome", searchKeyword, MatchMode.START).ignoreCase()).list(); and problem is solved :D – Rasshu Mar 22 '14 at 21:20

1 Answers1

0

Thanks to Xtreme Biker comment, changed ss.beginTransaction().commit() to ss.getTransaction().commit() and TransactionException is gone.

Changed getCurrentSession() to openSession() to get rid of SessionException.

Finally, changed the query line to List instituicoes = ss.createCriteria(Instituicao.class).add(Restrictions.like("inst_nome", searchKeyword, MatchMode.START).ignoreCase()).list(); and problem is solved.

Rasshu
  • 1,764
  • 6
  • 22
  • 53