【问题标题】:Autocomplete in Hibernate 3, no JTA, no EJB, no JPAHibernate 3 中的自动完成功能,没有 JTA,没有 EJB,没有 JPA
【发布时间】:2014-04-29 04:28:39
【问题描述】:

正如我在 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) 这样的代码比上面的样板代码更糟糕。

P.S.:转换器代码:

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

【问题讨论】:

  • 您的具体问题是什么?
  • 自动完成找不到任何东西
  • javax.el.E​​LException: /cadAcao.xhtml @84,122 value="#{AcaoController.listUserRH}": org.hibernate.TransactionException: 不支持嵌套事务
  • 在您的 DAO 方法中,您开始事务两次。
  • 将 beginTransaction().commit() 更改为 getTransaction().commit() 并且 TransactionException 消失了;然后将 getCurrentSession() 更改为 openSession() 并摆脱 SessionException;最后,将查询行更改为 List instituicoes = ss.createCriteria(Instituicao.class).add(Restrictions.like("inst_nome", searchKeyword, MatchMode.START).ignoreCase()).list();问题解决了:D

标签: java jsf primefaces glassfish-4 hibernate3


【解决方案1】:

感谢 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();,问题就解决了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    • 2021-10-01
    • 2012-11-11
    相关资源
    最近更新 更多