0

PrimeFaces ショーケースで読んだように、autoComplete が機能するにはコンバーターが必要なので、次のようにしました。

<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;" />

マネージド Bean メソッド:

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

DAO メソッド:

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

JTA、JPA 2.1、JSF 2.2、EJB 3.1、および Hibernate 4.3.4 を使用する方がよいことはわかっていますが (これらを使用しても完全に機能しました)、私が取り組んでいるプロジェクトでそれが受け入れられるかどうかはわかりません。心の狭い開発者は、「すべてをもう一度学習する」ことを望んでおらず、コードのようなものthis.manager.persist(entity)は上記のボイラープレートよりも悪いと考えています。

PS: コンバーター コード:

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

1 に答える 1

0

Xtreme Biker のコメントのおかげで、に変更さss.beginTransaction().commit()ss.getTransaction().commit()TransactionExceptionなくなりました。

を取り除くために に変更getCurrentSession()しました。openSession()SessionException

最後に、クエリ行を に変更しList instituicoes = ss.createCriteria(Instituicao.class).add(Restrictions.like("inst_nome", searchKeyword, MatchMode.START).ignoreCase()).list();て問題を解決しました。

于 2014-03-22T21:22:56.173 に答える