Estou criando uma DAO genérico utilizando o Hibernate 4.1
Gostaria de saber como eu posso criar uma busca em cima de um Objeto, que eu chamei de findByExample (Não estou usando Spring).
[HibernateUtil]
publicclassHibernateUtil{privatestaticSessionFactorysessionFactory;//COnfigura um objeto do tipo SessionFactory que irá prover todos os objetos de Sessão (Session)publicSessionFactorysetUp(){returnnewConfiguration().configure().buildSessionFactory();}//Obtem a SessionFactorypublicSessionFactorygetSessionFactory(){returnthis.sessionFactory=setUp();}}
[AbstractDAO]
publicabstractclassAbstractDAO<T>{privateClassclasse;privateSessionsession;publicAbstractDAO(){this.classe=(Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];setSession(newHibernateUtil().getSessionFactory());}publicvoidsetSession(SessionFactorysf){this.session=sf.openSession();}publicvoidsave(Tt){this.session.beginTransaction();this.session.save(t);this.session.close();}publicvoiddelete(Tt){this.session.beginTransaction();this.session.delete(t);this.session.close();}publicvoidalter(Tt){this.session.beginTransaction();this.session.update(t);this.session.close();}publicList<T>findAll(Tt){this.session.beginTransaction();returnthis.session.createCriteria(this.classe).list();}//Como implementar esta busca?publicList<T>findByExample(Tt){this.session.beginTransaction();}}
Uma dúvida que gerou agora, se reparar no meu método findAll eu não implementei o this.session.close(). Isto pode gerar algum problema mais grave?
Obrigado pela resposta.
F
fbl.lucas
Primeiramente, você não precisa abrir uma transação em consultas. Em segundo lugar você só precisa de uma instância de sessionFactory.
publicclassHibernateUtil{privatestaticfinalSessionFactorysessionFactory;//COnfigura um objeto do tipo SessionFactory que irá prover todos os objetos de Sessão (Session)static{this.sessionFactory=newConfiguration().configure().buildSessionFactory();}//Obtem a SessionpublicstaticSessiongetSession(){returnthis.sessionFactory.openSession();}}
publicabstractclassAbstractDAO<T>{privateClassclasse;privateSessionsession;publicAbstractDAO(){this.classe=(Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];}protectedSessiongetSession(){if(this.session==null||!this.session.isOpen()){this.session=HibernateUtil.getSession();}returnthis.session;}publicvoidsave(Tt){getSession().beginTransaction();getSession().save(t);getSession().close();}publicvoiddelete(Tt){getSession().beginTransaction();getSession().delete(t);getSession().close();}publicvoidalter(Tt){getSession().beginTransaction();getSession().update(t);getSession().close();}publicList<T>findAll(Tt){returngetSession().createCriteria(this.classe).list();}/** * Metodo responsavel por recuperar todos os objetos de uma tabela da base de dados de acordo * com o exemplo passado. * * @param filtro * @param matchMode * @param ignoreCase * @return lista */publicList<T>findByExample(Tfiltro,MatchModematchMode,booleanignoreCase){org.hibernate.criterion.Exampleexample=org.hibernate.criterion.Example.create(filtro);if(matchMode!=null){example=example.enableLike(matchMode);}if(ignoreCase){example=example.ignoreCase();}returngetSession().createCriteria(this.classe).add(example).list();}}
E
edu_fernandes
Entendi.
Agora uma dúvida aqui quanto ao Reflection.
Minha classe está em um pacote, quando eu pego ela no GenericDAO ele me traz o nome completo, incluindo o pacote onde ela está.
Como reverter isto e pegar apenas a classe, sem seu caminho?
F
fbl.lucas
edu_fernandes:
Entendi.
Agora uma dúvida aqui quanto ao Reflection.
Minha classe está em um pacote, quando eu pego ela no GenericDAO ele me traz o nome completo, incluindo o pacote onde ela está.
Como reverter isto e pegar apenas a classe, sem seu caminho?
Como assim cara, não entendi o que você esta fazendo e pq? como assim pegando a classe no genericDao? Coloca o código ai…
E
edu_fernandes
Ao pegar o classe ele me traz o pacote junto.
Ex.:
packagetestepublicclassMinhaClasse
No AbstractDAO, quando vou realizar uma busca, o SQL está dando erro pois ele está trazendo teste.MinhaClasse e atribuindo a minha Class classe
W
WRYEL
o método é Class.getSimpleName(). Cuidado com métodos de busca genérico, tenha em mente os limites que você quer, senão, você dará milhões de voltas, e não chegará onde se deseja =p