-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 posts ] 
Author Message
 Post subject: Un drôle de session.load(MonObjet.class, serializableId)
PostPosted: Thu Aug 18, 2005 5:36 am 
Beginner
Beginner

Joined: Fri May 13, 2005 9:39 am
Posts: 21
Bonjour à tous,
J'ai un comportement avec un session.load qui me surprend et qui surtout génère une erreur de type: un identifiant ne peut pas être nul.

Dans ma base de données, j'ai une entrée dans la table Project_Activty avec un id=242, dans mon appli WEB, je garde cet Id en session, le temps que je travaille dessus.
Afin d'effectuer une mise à jour sur un objet dépendant de ProjectActivity, je reloade mon instance de ProjectActivity avec l'id 242.
Après l'exécution de la commande session.load, en examinant l'instance obtenue dans un débogueur, l'ensemble des champs sont null alors que lorsque j'invoque la méthode getUnAttribut() de l'instance il me renvoie la bonne valeur.
par exemple, en imaginant que l'ensemble de mes attributs soient public:
Code:
Session session = HBSF.currentSession();
//Chargement du projet avec l'Id 242
ProjectActivity p = (ProjectActivity)session.load(ProjectActivity.class, new Integer(242));
//affiche à l'écran null
System.out.println(p.projectId);
//affiche à l'écran 242
System.out.println(p.getProjectId());

bizarre non?????
Si vous voyez un truc qui vous choque ou si vous avez besoin de plusq d'info...


Hibernate version:2.0

Mapping documents:
ProjectActivity:
Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
                            "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
                            "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >

<!-- DO NOT EDIT: This is a generated file that is synchronized -->
<!-- by MyEclipse Hibernate tool integration.                   -->
<!-- Created Wed Apr 06 16:18:35 CEST 2005                         -->
<hibernate-mapping package="com.isover.isolineproject.model">

   <class name="ProjectActivity" table="PROJECT_ACTIVITY" proxy="ProjectActivity" lazy="true">
      <id name="projectId" column="PROJECT_ID"
         type="java.lang.Integer">
         <generator class="increment" />
      </id>

      <property name="businessC" column="BUSINESS_C"
         type="java.lang.String" />
      <property name="projectCode" column="PROJECT_CODE"
         type="java.lang.String" />
      <property name="isolineDocObjId" column="ISOLINE_DOC_OBJ_ID"
         type="java.lang.Integer" />
      <property name="projectSiriusId" column="PROJECT_SIRIUS_ID"
         type="java.lang.Integer" />

      <many-to-one name="parentProjectActivity"
         column="PARENT_PROJECT_ID" class="ProjectActivity" />
      <many-to-one name="originProjectActivity"
         column="PROJECT_ORIGIN_ID" class="ProjectActivity" />
      <many-to-one name="projectActivityType" column="PROJECT_TYPE_ID"
         class="ProjectActivityType" not-null="true" />

      <set name="activityMembers" table="PROJECT_ACTIVITY_MEMBERS"
         lazy="true" inverse="false" cascade="all">
         <key column="PROJECT_ID" />
         <many-to-many
            class="com.isover.isolineproject.model.Person"
            column="PERSON_ID" />
      </set>

      <set name="projectCharacteristics" table="PROJECT_CHARACTERISTICS"  inverse="false" lazy="true">
         <key column="PROJECT_ID" />
         <many-to-many
            class="com.isover.isolineproject.model.Characteristics"
            column="CHARACTERISTIC_ID" />
      </set>

      <set name="projectCharters" order-by="LAST_UPDATE" inverse="true"  lazy="true">
         <key column="PROJECT_ID" />
         <one-to-many class="ProjectCharter"  />
      </set>
      
      <set name="subProjectActivity" inverse="false" lazy="true">
         <key column="PARENT_PROJECT_ID" />
         <one-to-many class="ProjectActivity" />
      </set>
      
      <set name="projectGateKeepers" order-by="GATE_NUMBER" inverse="false"  lazy="true">
         <key column="PROJECT_ID" />
         <one-to-many class="ProjectGateKeepers"  />
      </set>

      <set name="yearlyAchievmentsAndPrograms" order-by="YEAR" inverse="false" lazy="true">
         <key column="PROJECT_ID" />
         <one-to-many class="YearlyAchievmentAndProgram" />
      </set>

      <set name="stages" order-by="STAGE_ID" inverse="false"  lazy="true">
         <key column="PROJECT_ID" />
         <one-to-many class="Stage" />
      </set>
      
      <set name="GIE" inverse="false" lazy="true">
         <key column="PROJECT_ID" />
         <one-to-many class="Gie" />
      </set>
      
      <set name="TollGates" inverse="true" lazy="true" order-by="PHASE_ID">
         <key column="PROJECT_ID"/>
         <one-to-many class="TollGate"/>
      </set>
      
   </class>
   <sql-query name="active.project">
      <return alias="pa" class="ProjectActivity"/>   
      Select {pa.*} from Project_Activity {pa}, Project_Status ps
      where pa.project_id = ps.project_id
      and last_update = (select max(last_update) from Project_Status where pa.project_id = project_id)
      order by pa.project_Code      
   </sql-query>
</hibernate-mapping>

Code between sessionFactory.openSession() and session.close():
Code:
ProjectActivity p = session.load(ProjectActivity.class, id);
return p;


Full stack trace of any exception that occurs:

java.lang.NullPointerException: null is not a valid identifier
at net.sf.hibernate.impl.SessionImpl.load(SessionImpl.java:1928)
at com.isover.isolineproject.persistence.managers.ProjectLevelManager.findbyLevelId(ProjectLevelManager.java:33)
at com.isover.isolineproject.projectoverview.struts.forms.ProjectCharterMainForm.getProjectLevel(ProjectCharterMainForm.java:267)
at com.isover.isolineproject.persistence.managers.ProjectCharterManager.createNewVersion(ProjectCharterManager.java:118)
at com.isover.isolineproject.projectoverview.struts.action.EditProjectCharterAction.update(EditProjectCharterAction.java:410)
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 org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
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.isover.isolineproject.HibernateFilter.doFilter(HibernateFilter.java:45)
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)
Name and version of the database you are using:Oracle 9i Database

The generated SQL (show_sql=true):

Debug level Hibernate log excerpt:
[/code][/u][/b]


Top
 Profile  
 
 Post subject:
PostPosted: Thu Aug 18, 2005 8:50 am 
Hibernate Team
Hibernate Team

Joined: Sun Sep 14, 2003 3:54 am
Posts: 7256
Location: Paris, France
Utilise toujours le getter pour un objet lazy, c'est le seul moyen pour un proxy de détecter un accès et de charger l'état de l'objet.
L'autre solution est d'utiliser une tâche de bytecode enhancement, mais bon ça alourdit ton build et ça nécessite d'enhancer tout le code qui utilise l'objet.

_________________
Emmanuel


Top
 Profile  
 
 Post subject: Le problème c'est que je ne peux pas appeler cette méthode
PostPosted: Thu Aug 18, 2005 9:04 am 
Beginner
Beginner

Joined: Fri May 13, 2005 9:39 am
Posts: 21
J'ai un petit peu avancé, il faudrait que j'utilise Hibernate.initialize(project)
mais cela ne fonctionne pas

Je ne peux plus appeler de getter une fois qu'hibernate a pris la main.

Pour décrire mon problème de façon plus précise.
J'ai deux table PROJECT_CHARTER qui fait reference par PROJECT_ID à la table PROJECT_ACTIVITY.

Dans mon mapping de PROJECT_CHARTER, j'ai un composite Id qui contient deux champs:
- LAST_UPDATE: version mappée en Date
- PROJECT_ID: Id du Projet qui est mappé en ProjectActivity

Quand je veux ajouter une version de Project_Charter (par exemple le nom du projet a changé), je créée un identifiant ProjectCharterKey à partir de la date système et de mon projet courant.
pour cela je créée un objet projet que je charge.

Code:
      Transaction tx = null;
      try {
          Session session = HibernateSessionFactory.currentSession();
          tx = session.beginTransaction();

          ProjectActivity project = paManager.findByProjectActivityId( pcForm.getProjectId() );
          Hibernate.initialize(project);
          System.out.println(project.getProjectId());
          System.out.println(project.getProjectCode());
          tx.commit();
          System.out.println("Project Initialized? "+Hibernate.isInitialized(project));
          ProjectCharter basedOn = project.getProjectCharterVersion( new Date(pcForm.getVersion().longValue()) );
         
          if (basedOn == null)
            throw new IsoException(this.getClass().getName(),"ProjectCharterManager - createNewVersion", new Exception("Could not update a Project Charter based on null Project Charter"));
   
          // 1°Section : Project Charter
          ProjectCharterMainForm mainForm = pcForm.getMainForm();
         
          ProjectCharterKey newcharterId = new ProjectCharterKey();
          newcharterId.setLastUpdate(currentDate);
          newcharterId.setProjectActivity(basedOn.getId().getProjectActivity());
          ProjectCharter newCharter = new ProjectCharter( newcharterId );
          newCharter.setProjectName( mainForm.getProjectName() );
          newCharter.setProjectMainObjectives( mainForm.getObjectivesSummary() );
          newCharter.setProjectActivityPriority( mainForm.getPriority() );
          Person currentPrjLeader = project.getProjectLeader();
          Person newPrjLeader = mainForm.getProjectLeader();
          if (!currentPrjLeader.equals(newPrjLeader)) {
             project.defineNewProjectLeader(newPrjLeader);
          }
               
          if (project.isActivity()) {
             newCharter.setProjectLevel(null);
             newCharter.setIdeationDate(null);
             newCharter.setPostLaunchDate(null);
          } else {
             newCharter.setProjectLevel( mainForm.getProjectLevel() );
                  
             DateFormat dF = DateFormatUtil.getDateFormat();
             try { // Exception is never catch, Struts Form validate have already check it
                if (mainForm.getIdeationDate()==null || mainForm.getIdeationDate().length()==0)
                   newCharter.setIdeationDate(null);
                else
                   newCharter.setIdeationDate( dF.parse(mainForm.getIdeationDate()) );
                
                if (mainForm.getPostLaunchDate() == null || mainForm.getPostLaunchDate().length()==0)
                   newCharter.setPostLaunchDate(null);
                else
                   newCharter.setPostLaunchDate( dF.parse(mainForm.getPostLaunchDate()) );
             } catch (ParseException pe) { }
          }
         
          if ( !project.getPortfolio().getPortfolioId().equals(mainForm.getPortfolioID()) ) {
             System.out.println("in a new portfolio");
               ProjectPortfolioKey pPortfolioKey = new ProjectPortfolioKey();
               pPortfolioKey.setPortfolio( mainForm.getPortfolio() );
               pPortfolioKey.setProjectActivity( project );
               pPortfolioKey.setLastUpdate( currentDate );
               ProjectPortfolio pPortfolio = new ProjectPortfolio(pPortfolioKey);
               session.save(pPortfolio);             
          }
            
          session.save(newCharter);         tx.commit();
//tous les catch qui vont bien.


Mapping de PROJECT_ACTIVITY:
Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
                            "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
                            "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >

<!-- DO NOT EDIT: This is a generated file that is synchronized -->
<!-- by MyEclipse Hibernate tool integration.                   -->
<!-- Created Wed Apr 06 16:18:35 CEST 2005                         -->
<hibernate-mapping package="com.isover.isolineproject.model">

   <class name="ProjectActivity" table="PROJECT_ACTIVITY" proxy="ProjectActivity" lazy="true">
      <id name="projectId" column="PROJECT_ID"
         type="java.lang.Integer">
         <generator class="increment" />
      </id>

      <property name="businessC" column="BUSINESS_C"
         type="java.lang.String" />
      <property name="projectCode" column="PROJECT_CODE"
         type="java.lang.String" />
      <property name="isolineDocObjId" column="ISOLINE_DOC_OBJ_ID"
         type="java.lang.Integer" />
      <property name="projectSiriusId" column="PROJECT_SIRIUS_ID"
         type="java.lang.Integer" />

      <many-to-one name="parentProjectActivity"
         column="PARENT_PROJECT_ID" class="ProjectActivity" />
      <many-to-one name="originProjectActivity"
         column="PROJECT_ORIGIN_ID" class="ProjectActivity" />
      <many-to-one name="projectActivityType" column="PROJECT_TYPE_ID"
         class="ProjectActivityType" not-null="true" />

      <set name="activityMembers" table="PROJECT_ACTIVITY_MEMBERS"
         lazy="true" inverse="false" cascade="all">
         <key column="PROJECT_ID" />
         <many-to-many
            class="com.isover.isolineproject.model.Person"
            column="PERSON_ID" />
      </set>

      <set name="projectCharacteristics" table="PROJECT_CHARACTERISTICS"  inverse="false" lazy="true">
         <key column="PROJECT_ID" />
         <many-to-many
            class="com.isover.isolineproject.model.Characteristics"
            column="CHARACTERISTIC_ID" />
      </set>

      <set name="projectCharters" order-by="LAST_UPDATE" inverse="true"  lazy="true">
         <key column="PROJECT_ID" />
         <one-to-many class="ProjectCharter"  />
      </set>
      
      <set name="subProjectActivity" inverse="false" lazy="true">
         <key column="PARENT_PROJECT_ID" />
         <one-to-many class="ProjectActivity" />
      </set>
      
      <set name="projectGateKeepers" order-by="GATE_NUMBER" inverse="false"  lazy="true">
         <key column="PROJECT_ID" />
         <one-to-many class="ProjectGateKeepers"  />
      </set>

      <set name="yearlyAchievmentsAndPrograms" order-by="YEAR" inverse="false" lazy="true">
         <key column="PROJECT_ID" />
         <one-to-many class="YearlyAchievmentAndProgram" />
      </set>

      <set name="stages" order-by="STAGE_ID" inverse="false"  lazy="true">
         <key column="PROJECT_ID" />
         <one-to-many class="Stage" />
      </set>
      
      <set name="GIE" inverse="false" lazy="true">
         <key column="PROJECT_ID" />
         <one-to-many class="Gie" />
      </set>
      
      <set name="TollGates" inverse="true" lazy="true" order-by="PHASE_ID">
         <key column="PROJECT_ID"/>
         <one-to-many class="TollGate"/>
      </set>
      
   </class>
   <sql-query name="active.project">
      <return alias="pa" class="ProjectActivity"/>   
      Select {pa.*} from Project_Activity {pa}, Project_Status ps
      where pa.project_id = ps.project_id
      and last_update = (select max(last_update) from Project_Status where pa.project_id = project_id)
      order by pa.project_Code      
   </sql-query>
</hibernate-mapping>



Mapping de PROJECT_ACTIVITY:
Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
                            "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
                            "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >

<!-- DO NOT EDIT: This is a generated file that is synchronized -->
<!-- by MyEclipse Hibernate tool integration.                   -->
<!-- Created Wed Apr 06 16:12:30 CEST 2005                         -->
<hibernate-mapping package="com.isover.isolineproject.model">

    <class name="ProjectCharter" table="PROJECT_CHARTER">
        <composite-id name="id" class="ProjectCharterKey">
            <key-property name="lastUpdate" column="LAST_UPDATE" type="timestamp"/>
            <key-many-to-one name="projectActivity" column="PROJECT_ID" class="ProjectActivity"/>
        </composite-id>

        <property name="projectName" column="PROJECT_NAME" type="java.lang.String" />
        <property name="projectMainObjectives" column="PROJECT_MAIN_OBJECTIVES" type="text"  not-null="true" />
      <property name="ideationDate" column="IDEATION_DATE" type="date" />
      <property name="postLaunchDate" column="POST_LAUNCH_DATE" type="date" />
      
        <many-to-one name="projectActivityPriority" column="PROJECT_ACTIVITY_PRIORITY_ID" class="ProjectActivityPriority" />
        <many-to-one name="projectLevel" column="LEVEL_ID" class="ProjectLevel" />
       
        <set name="detailedObjectives" lazy="true" inverse="true" order-by="objective_rank">
           <key>
              <column name="LAST_UPDATE"/>           
              <column name="PROJECT_ID"/>
           </key>
           <one-to-many class="ProjectDetailedObjectives"/>
        </set>
    </class>
   
</hibernate-mapping>



Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.