正如我在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()); } }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()); } }最满意答案
感谢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(); 问题解决了。
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.
更多推荐
发布评论