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());
}
}