Hibernate version: 3.1.3
Name and version of the database you are using: Postgres 8.1.1
Hello, I'm having a curious problem while migrating from Hibernate 2.1.8 to 3.1.3. I have follow Migration Guide's instructions and the migration is almost done, except for one single mapping: a many-to-one with lazy="true" aren't load when I get the root objetc.
My mappings are below:
The root object that I'm retrieving:
Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping default-lazy="false" schema="Atendimento">
<class name="com.mycompany.system.model.Mesa">
<id name="id" column="id" type="long" unsaved-value="-1">
<generator class="increment"/>
</id>
....
<many-to-one
lazy="false"
name="atendente"
column="atendente"/>
...
</class>
</hibernate-mapping>
Mapping for "atendente" relationship:
Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping default-lazy="false" schema="Atendimento">
<class name="com.mycompany.system.model.Atendente">
<id name="id" column="id" type="long" unsaved-value="-1">
<generator class="increment"/>
</id>
<many-to-one name="usuario" column="id_usuario" lazy="false"/>
...
</class>
</hibernate-mapping>
And mapping for "usuario" (the class is a subclass from an access control infrainstructure):
Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping default-lazy="false" schema = "ControleAcesso">
<class name="com.mycompany.system.accesscontrol.AControlEntity" lazy="false">
<id name="id" unsaved-value="-1">
<generator class="increment"/>
</id>
<set name="permissions" lazy="true">
<key column="permission_id"/>
<one-to-many class="com.mycompany.system.accesscontrol.tbfunction.TBFunction"/>
</set>
<joined-subclass name="com.mycompany.system.user.TBUser" lazy="false">
<key column="ID"/>
<property name="login" not-null="true" unique="true"/>
...
</joined-subclass>
</class>
</hibernate-mapping>
When I load a "Mesa" object, all properties from "Mesa" and "atendente" are correctly load, except "usuario" that comes null, but _there is_ a register in database for user. I have take a look at the following links:
http://opensource.atlassian.com/project ... e/HHH-1435But this doesn't help.
Section 5.1.11 from the manual says that "lazy="false" specifies that the association will always be eagerly fetched. Note that if constrained="false", proxying is impossible and Hibernate will eager fetch the association!". If I put:
Code:
<many-to-one name="usuario" column="id_usuario" lazy="false"/>
"usuario" must be load when "atendente" were load, don't?
The HQL used to load "mesa" is:
Code:
from
Mesa mesa
left join fetch
mesa.atendente atendente
left join fetch
atendente.usuario usuario
where
mesa.agencia.id=?
That generates the SQL query below:
Code:
select mesa0_.id as id103_0_,
atendente1_.id as id158_1_,
tbuser2_.ID as id87_2_,
mesa0_.data as data103_0_,
mesa0_.id_agencia as id3_103_0_,
mesa0_.mesa_unit as mesa4_103_0_,
mesa0_.atendente as atendente103_0_,
mesa0_.status as status103_0_,
mesa0_.data_abertura as data7_103_0_,
mesa0_.usuario_abertura as usuario8_103_0_,
mesa0_.data_fechamento as data9_103_0_,
mesa0_.usuario_fechamento as usuario10_103_0_,
mesa0_.data_inicio_status as data11_103_0_,
mesa0_2_.senha_atual as senha2_105_0_,
mesa0_2_.numero_atendimento as numero3_105_0_,
case
when mesa0_1_.id is not null then 1
when mesa0_2_.id is not null then 2
when mesa0_.id is not null then 0
end as clazz_0_,
atendente1_.id_usuario as id2_158_1_,
tbuser2_.login as login91_2_,
tbuser2_.password as password91_2_,
tbuser2_.registration as registra4_91_2_,
tbuser2_.name as name91_2_,
tbuser2_.apelido as apelido91_2_,
tbuser2_.nivel as nivel91_2_,
tbuser2_.idioma as idioma91_2_,
tbuser2_.branch as branch91_2_,
tbuser2_.jobFunction as jobFunc10_91_2_
from Atendimento.Mesa mesa0_
left outer join
Atendimento.mesa_recepcao mesa0_1_ on mesa0_.id=mesa0_1_.id
left outer join
Atendimento.mesa_atendimento mesa0_2_ on mesa0_.id=mesa0_2_.id
left outer join
Atendimento.Atendente atendente1_ on mesa0_.atendente=atendente1_.id
left outer join
ControleAcesso.TBUser tbuser2_ on atendente1_.id_usuario=tbuser2_.ID
left outer join
ControleAcesso.AControlEntity tbuser2_1_ on tbuser2_.ID=tbuser2_1_.id
where mesa0_.id_agencia=?)
As you can see, I'm trying to use join fetch to load "usuario" in a single query, but without success. What am I doing wrong?
Kind Regards,
Full stack trace of any exception that occurs:Code:
java.lang.NullPointerException
at com.mycompany.system.model.Atendente.getLogin(Atendente.java:105)
at com.mycompany.system.rmi.ServidorAtendimento.getMesasAbertas(ServidorAtendimento.java:1263)
at com.mycompany.system.rmi.ServidorAtendimento$$EnhancerByCGLIB$$4e2520b5.CGLIB$getMesasAbertas$15(<generated>)
at com.mycompany.system.rmi.ServidorAtendimento$$EnhancerByCGLIB$$4e2520b5$$FastClassByCGLIB$$783cf764.invoke(<generated>)
at net.sf.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:167)
at com.mycompany.infra.proxy.GenericProxy.intercept(GenericProxy.java:245)
at com.mycompany.system.rmi.ServidorAtendimento$$EnhancerByCGLIB$$4e2520b5.getMesasAbertas(<generated>)
at com.mycompany.system.rmi.ServidorAtendimento.abrirMesaAtendimento(ServidorAtendimento.java:751)
at com.mycompany.system.rmi.ServidorAtendimento$$EnhancerByCGLIB$$4e2520b5.CGLIB$abrirMesaAtendimento$17(<generated>)
at com.mycompany.system.rmi.ServidorAtendimento$$EnhancerByCGLIB$$4e2520b5$$FastClassByCGLIB$$783cf764.invoke(<generated>)
at net.sf.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:167)
at com.mycompany.infra.proxy.GenericProxy.intercept(GenericProxy.java:245)
at com.mycompany.system.rmi.ServidorAtendimento$$EnhancerByCGLIB$$4e2520b5.abrirMesaAtendimento(<generated>)
at com.mycompany.system.web.action.AbrirMesaAction.insert(AbrirMesaAction.java:35)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:280)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:216)
at com.mycompany.system.gui.struts.systemRequestProcessor.processActionPerform(systemRequestProcessor.java:96)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
at com.mycompany.system.gui.struts.systemRequestProcessor.process(systemRequestProcessor.java:85)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at com.mycompany.infra.persistence.hibernate3.OpenSessionInViewFilter.doFilter(OpenSessionInViewFilter.java:57)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
at java.lang.Thread.run(Thread.java:534)
StandardWrapperValve[action]: Servlet.service() for servlet action threw exception
java.lang.NullPointerException
at com.mycompany.system.gui.struts.systemExceptionHandler.execute(systemExceptionHandler.java:48)
at org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:553)
at com.mycompany.system.gui.struts.systemRequestProcessor.processActionPerform(systemRequestProcessor.java:98)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
at com.mycompany.system.gui.struts.systemRequestProcessor.process(systemRequestProcessor.java:85)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at com.mycompany.infra.persistence.hibernate3.OpenSessionInViewFilter.doFilter(OpenSessionInViewFilter.java:57)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
at java.lang.Thread.run(Thread.java:534)