Olá Pessoal!
Tenho a seguinte classe:
package bean;
import bean.Titulacao;
public class Professor {
private int pfr_id;
private String pfr_matricula;
private String pfr_nome;
private Titulacao pfr_titulacao
public int getPfr_id() {
return pfr_id;
}
public void setPfr_id(int pfr_id) {
this.pfr_id = pfr_id;
}
public String getPfr_matricula() {
return pfr_matricula;
}
public void setPfr_matricula(String pfr_matricula) {
this.pfr_matricula = pfr_matricula;
}
public String getPfr_nome() {
return pfr_nome;
}
public void setPfr_nome(String pfr_nome) {
this.pfr_nome = pfr_nome;
}
public Titulacao getPfr_titulacao() {
return pfr_titulacao;
}
public void setPfr_titulacao(Titulacao pfr_titulacao) {
this.pfr_titulacao = pfr_titulacao;
}
}
No formulário de manutenção de Professores, o campo TITULACAO é um ComboBox com todas as titulações cadastradas e ao ser selecionado me disponibiliza o ID da titulação. Como passei a usar o Hibernate, o atributo Titulação passou de Integer para Objeto Titulação. Como faço para usar o Get/Set da Titulacao sendo este um Objeto e o que retorna ou é enviado para o formulário é um Integer?
Achei um forma de utilizar o Set/Get, porém não sei se é a melhor:
Get
Titulacao titulacao = professor.getPfr_titulacao(); --> retorna o Objeto Titulacao da Classe Professor
int tit = titulacao.getTtl_id(); --------------------------> retorna o ID do objeto Titulação da classe Titulacao
Set
int titId = Integer.parseInt(request.getParameter("titId")); --> request campo Titulacao do FORM.HTML
Titulacao titulacao = titulacaoDao.getTitulacao(tit); ------> retorna Objeto Titulação de acordo com o titID
professor.setPfr_titulacao(titulacao); ----------------------> executa o método Set
Grato.
Bom… vc teve a duvida e a resposta!
Está correto!
Vc tb pode fazer isso utilizsando linkedInvocation, do tipo
tit = professor.getPfr_titulacao().getTtl_id();
Interessante essa solução… vou implementar e testar.
public List getListaProfessores() throws SistemaException {
List<Professor> todosProfessores = new ArrayList();
try {
Session session = ConexaoHibernate.getSession();
Query select = session.createQuery("from bean.Professor as professor order by professor.pfr_nome");
todosProfessores = select.list();
session.close();
}
catch (Exception ex){
throw new SistemaException("ProfessorDao","getListaProfessor","Não foi possível buscar lista Professor Cadastrados no banco de dados.\n" + ex.getMessage(), "query");
}
return todosProfessores;
}
Como já mencionei anteriormente, eu passei a implementar o Hibernate no meu projeto. Preciso confirmar se sempre que executar um Query no bean.Professor ele trará automaticamente o bean.Titulação, em função do “many-to-one”, ou preciso fazer o Join Titulacao na query?
[quote=FlavioMaia]Como já mencionei anteriormente, eu passei a implementar o Hibernate no meu projeto. Preciso confirmar se sempre que executar um Query no bean.Professor ele trará automaticamente o bean.Titulação, em função do “many-to-one”, ou preciso fazer o Join Titulacao na query?
[/quote]
No hibernate existe uma politica de carregamento das informações de referencia, chamada de LazyLoading. Com isso, se vc tem, Pedido HAS-A Set e o lazy da entidade Pedido está como True, assim que vc fizer o getItensPedido(), ele executará a query e carregará as informações, CASO A SESSÃO AINDA ESTEJA VÁLIDA!!!
Verifique a configuração do seu lazy…
Complementando o item anterior, ao implementar o código abaixo:
<td class="CelLinDir"><%=professor.getPfr_titulacao().getTtl_descricao()%></td>
Deu o seguinte erro:
16:38:34,500 ERROR LazyInitializationException:19 - could not initialize proxy - no Session
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:57)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111)
at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:150)
at bean.Titulacao$$EnhancerByCGLIB$$eb54b4ee.getTtl_descricao(<generated>)
at org.apache.jsp.professor_005flst_jsp._jspService(professor_005flst_jsp.java:104)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:672)
at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:574)
at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:499)
at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:966)
at org.apache.jsp.professor_jsp._jspService(professor_jsp.java:59)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595)
could not initialize proxy - no Session
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:57)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111)
at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:150)
at bean.Titulacao$$EnhancerByCGLIB$$eb54b4ee.getTtl_descricao(<generated>)
at org.apache.jsp.professor_005flst_jsp._jspService(professor_005flst_jsp.java:104)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:672)
at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:574)
at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:499)
at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:966)
at org.apache.jsp.professor_jsp._jspService(professor_jsp.java:59)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595)
Até então eu listava somente a Matrícula e o Nome, e agora implementei a Titulação, conforme a dica enviada: linkedInvocation.
Ainda bem que meu tópico veio antes do seu…
A sessão precisa estar aberta para o lazy funcionar, caso ele esteja com o lazy ativado.
Alguns links!
http://www.javalobby.org/java/forums/t20533.html - Understanding Lazy Fetching
http://www.hibernate.org/162.html - Some explanations on lazy loading
http://www.hibernate.org/43.html - Open Session in View
Olá Rodrigo!
Acessei os links mencionados por você e como utilizo DAO, coloquei em comentário a linha que fecha a sessão e funcionou.
try {
Session session = ConexaoHibernate.getSession();
Query select = session.createQuery("from bean.Professor as professor order by professor.pfr_nome");
todosProfessores = select.list();
//session.close();
}
Você comentou em configurar o Lazy para true, infelizmente não entendi como colocar isso no Professor.hbm.xml:
<class name="Professor" table="professor">
<!-- Identificador da classe -->
<id name="pfr_id">
<generator class="increment"/>
</id>
<!-- Propriedades da classe -->
<property name="pfr_matricula"/>
<property name="pfr_nome"/>
<property name="pfr_qtdHoras"/>
<many-to-one name="pfr_titulacao" class="bean.Titulacao" column="pfr_titulacao"
/>
</class>
Obrigado pela atenção.
Boas
alguem me pode dar uma ajuda nisto?
estou a fazer loading de um objecto com uma relação de many to many e tenho sempre este erro…
Hibernate: select dbartigos0_.id as id0_0_, dbartigos0_.descricao as descricao0_0_, dbartigos0_.observacoes as observac3_0_0_, dbartigos0_.quantidade_existente as quantidade4_0_0_, dbartigos0_.quantidade_ideal as quantidade5_0_0_, dbartigos0_.quantidade_disponivel as quantidade6_0_0_, dbartigos0_.peso as peso0_0_, dbartigos0_.volume as volume0_0_, dbartigos0_.inventario as inventario0_0_, dbartigos0_.situacao as situacao0_0_, dbartigos0_.etiqueta as etiqueta0_0_ from DBARTIGOS dbartigos0_ where dbartigos0_.id=?
Hibernate: select dbdepartam0_.DBDEPARTAMENTO_ID as DBDEPART1_0_, dbdepartam0_.DBARTIGOS_ID as DBARTIGOS2_0_ from DBDEPARTAMENTO_TO_DBARTIGOS dbdepartam0_ where dbdepartam0_.DBDEPARTAMENTO_ID=?
Exception in thread "AWT-EventQueue-0" org.hibernate.HibernateException: CGLIB Enhancement failed: fact.dbdepartamento
at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.getProxy(CGLIBLazyInitializer.java:96)
at org.hibernate.proxy.pojo.cglib.CGLIBProxyFactory.getProxy(CGLIBProxyFactory.java:49)
at org.hibernate.tuple.entity.AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:379)
at org.hibernate.persister.entity.AbstractEntityPersister.createProxy(AbstractEntityPersister.java:3455)
at org.hibernate.event.def.DefaultLoadEventListener.createProxyIfNecessary(DefaultLoadEventListener.java:257)
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:191)
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:103)
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:878)
Solved:)
faltava um construtor sem parametros…