在Hibernate 3中自动完成,没有JTA,没有EJB,没有JPA(Autocomplete in Hibernate 3, no JTA, no EJB, no JPA)

编程入门 行业动态 更新时间:2024-10-27 20:33:44
在Hibernate 3中自动完成,没有JTA,没有EJB,没有JPA(Autocomplete in Hibernate 3, no JTA, no EJB, no JPA)

正如我在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.

更多推荐

本文发布于:2023-08-03 09:49:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1386711.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:自动完成   JTA   Hibernate   Autocomplete   JPA

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!