I should also mention that the actual Node object does get updated, just not 
the Emissions. So as I loop through, the modifiedBy and modifiedDate fields in 
Node are getting set and those new values are properly stored in the DB. 

Regards,
August





----- Original Message ----
From: August Detlefsen <[EMAIL PROTECTED]>
To: dev@castor.codehaus.org
Sent: Friday, October 31, 2008 9:13:09 AM
Subject: Re: [castor-dev] Persistent Objects not updating in for loop

Emissions is a polymorphic object, extending from Node: 

  <!-- Mapping for Emissions -->
  <class name="org.openeco.footprint.model.Emissions" 
extends="com.codemagi.servlets.model.Node" identity="id">
      <description>An actual emission for one month</description>
      <cache-type type="none"/>
      <map-to table="emissions_data" xml="emissions-data" />
      <field name="id" type="integer">
          <sql dirty="ignore" name="node_id" type="integer"/>
          <bind-xml name="id" node="element"/>
      </field>
      <field name="source" type="org.openeco.footprint.model.Source">
          <sql dirty="ignore" name="source_id"/>
          <bind-xml name="source" node="element"/>
      </field>
      <field name="sourceName" type="org.openeco.footprint.model.SourceName">
          <sql dirty="ignore" name="source_name_id"/>
          <bind-xml name="source-name" node="element"/>
      </field>
      <field name="orgId" type="integer">
          <sql dirty="ignore" name="org_id" type="integer"/>
          <bind-xml name="org-id" node="element"/>
      </field>
      <field name="startDate" type="date">
          <sql dirty="ignore" name="start_date" type="date"/>
          <bind-xml name="start-date" node="element"/>
      </field>
      <field name="CO2" type="float" >
          <sql name="co2_emissions" type="numeric"/>
          <bind-xml name="CO2" node="element"/>
      </field>
      <field name="CH4" type="float" >
          <sql name="ch4_emissions" type="numeric"/>
          <bind-xml name="CH4" node="element"/>
      </field>
      <field name="N2O" type="float" >
          <sql name="n2o_emissions" type="numeric"/>
          <bind-xml name="N2O" node="element"/>
      </field>
      <field name="HFC" type="float" >
          <sql name="hfc_emissions" type="numeric"/>
          <bind-xml name="HFC" node="element"/>
      </field>
      <field name="PFC" type="float" >
          <sql name="pfc_emissions" type="numeric"/>
          <bind-xml name="PFC" node="element"/>
      </field>
      <field name="SF6" type="float" >
          <sql name="sf6_emissions" type="numeric"/>
          <bind-xml name="SF6" node="element"/>
      </field>
      <field name="totalCO2" type="float" >
          <sql name="total_co2_equivalent" type="numeric"/>
          <bind-xml name="total-co2" node="element"/>
      </field>
      <field name="type" type="org.openeco.footprint.model.FuelType">
          <sql name="fuel_type_id"/>
          <bind-xml name="fuel-type" node="element"/>
      </field>
      <field name="fuelUnit" type="org.openeco.ghg.model.Units">
          <sql name="fuel_unit_id" />
          <bind-xml name="fuel-unit" node="element"/>
      </field>
      <field name="fuelAmount" type="float" >
          <sql name="fuel_amount" type="numeric"/>
          <bind-xml name="fuel-amount" node="element"/>
      </field>
      <field name="activityUnit" type="org.openeco.ghg.model.Units">
          <sql name="activity_unit_id" />
          <bind-xml name="activity-unit" node="element"/>
      </field>
      <field name="activityAmount" type="float" >
          <sql name="activity_amount" type="numeric"/>
          <bind-xml name="activity-amount" node="element"/>
      </field>
  </class>


  <!-- Mapping for Node -->
  <class name="com.codemagi.servlets.model.Node" identity="id" 
key-generator="IDENTITY">
      <cache-type type="none"/>
      <description>Node, the base class for all object types</description>
      <map-to table="node" xml="node" />
      <field name="id" type="integer">
          <sql dirty="ignore" name="node_id" type="integer"/>
          <bind-xml name="id" node="element"/>
      </field>
      <field name="name" type="string" >
          <sql dirty="ignore" name="node_name" type="varchar"/>
          <bind-xml name="name" node="element"/>
      </field>
      <field name="className" type="string" >
          <sql dirty="ignore" name="class_name" type="varchar"/>
          <bind-xml name="class-name" node="element"/>
      </field>
      <field name="createdBy" type="org.openeco.login.model.User">
          <sql dirty="ignore" name="created_by" />
          <bind-xml name="created-by" node="element" transient="true" />
      </field>
      <field name="createdDate" type="date">
          <sql dirty="ignore" name="created_date" type="timestamp"/>
          <bind-xml name="created-date" node="element"/>
      </field>
      <field name="modifiedBy" type="org.openeco.login.model.User">
          <sql dirty="ignore" name="modified_by" />
          <bind-xml name="modified-by" node="element" transient="true"/>
      </field>
      <field name="modifiedDate" type="date">
          <sql dirty="ignore" name="modified_date" type="timestamp"/>
          <bind-xml name="modified-date" node="element"/>
      </field>
      <field name="ipAddress" type="string" >
          <sql dirty="ignore" name="ip_address" type="varchar"/>
          <bind-xml name="ip-address" node="element"/>
      </field>
      <field name="parent" type="com.codemagi.servlets.model.Node">
          <sql dirty="ignore" name="parent_id" many-table="node_node_xref" 
many-key="child_id" />
          <bind-xml name="parent"/>
      </field>
      <field name="terms" type="com.codemagi.servlets.model.Term" 
collection="arraylist">
          <sql dirty="ignore" name="term_id" many-table="term_node_xref" 
many-key="node_id" />
          <bind-xml name="terms"/>
      </field>
      <field name="children" type="com.codemagi.servlets.model.Node" 
collection="arraylist">
          <sql dirty="ignore" name="child_id" many-table="node_node_xref" 
many-key="parent_id" />
          <bind-xml name="children"/>
      </field>
      <field name="users" type="org.openeco.login.model.User" 
collection="arraylist">
          <sql dirty="ignore" name="user_id" many-table="node_user_xref" 
many-key="node_id" />
          <bind-xml name="users"/>
      </field>
  </class>





----- Original Message ----
From: Werner Guttmann <[EMAIL PROTECTED]>
To: dev@castor.codehaus.org
Sent: Friday, October 31, 2008 1:10:19 AM
Subject: Re: [castor-dev] Persistent Objects not updating in for loop

August,

what does the mapping look like for Emission entities ?

Werner

August Detlefsen wrote:
> Greetings. I am having an issue getting persistent objects to update when 
> they are updated inside a for() loop. Here's the scenario: 
> 
> We are storing CO2 emissions over the course of a span of months. For each 
> month, there is either an existing emission to be updated, or we need to 
> create a new one. 
> 
> Any new objects we create in the course of the loop are getting added to the 
> database properly, but existing objects that updated are not getting 
> persisted and the changes do not show up in the DB. 
> 
> The code works like this: 
> 
>             //load up all existing emissions in the span                      
>                                                                               
>                       
>             HashMap existingEmissions = new HashMap();
>             oql = db.getOQLQuery(" SELECT e FROM 
> org.openeco.footprint.model.Emissions e " +
>                                  " WHERE e.sourceName.id = $1 " +
>                                  " AND e.startDate >= $2 AND e.startDate <= 
> $3 ");
>             oql.bind(name.getId());
>             oql.bind(startDate);
>             oql.bind(endDate);
> 
>             results = oql.execute();
>             while (results.hasMore()) {
>                 Emissions e = (Emissions)results.next();
>                 existingEmissions.put(e.getStartDate(), e);
>             }
> 
>             // Explicitly close the QueryResults                              
>                                                                               
>                       
>             results.close();
> 
>             // Explicitly close the OQLQuery                                  
>                                                                               
>                       
>             oql.close();
> 
>             //for each month in the span, create or edit emission             
>                                                                               
>                                  
>             for (int i = 0; i < span; i++) {
> 
>                 Date emissionDate = DateUtils.addMonths(startDate, i);
>                 log.debug("Checking for emission with name: " + name.getId() 
> + " and date: " + emissionDate);
> 
>                 Emissions emission = 
> (Emissions)existingEmissions.get(emissionDate);
>                 log.debug("Existing emissions: " + emission + " persistent? " 
> + db.isPersistent(emission));
>                 if (emission == null) {
>                     emission = new Emissions();
>                     emission.setSourceName(name);
>                     emission.setStartDate( emissionDate );
>                 }
> 
>                    //set new values into emission 
>                 emission.setCO2(CO2);
>                 emission.setCH4(CH4);
>                 emission.setN2O(N2O);
>                 emission.setHFC(HFC);
>                 emission.setPFC(PFC);
>                 emission.setSF6(SF6);
>                 emission.setTotalCO2(totalCO2);
> 
>                 if (emission.getId() == null) {
>                     log.debug("Creating new emission: " + emission);
>                     db.create(emission);
>                 }
> 
>             }
> 
>             //save changes to db                                              
>                                                                               
>                       
>             log.debug("About to commit...");
>             db.commit();
>             log.debug("Done.");
> 
> 
> I've checked all the code and eliminated all the usual suspects: 
> 
> - Emissions are not loaded with Database.ReadOnly
> - Added and removed <sql dirty="ignore" from mappings
> - No access="read-only" in mappings
> - The database user does have UPDATE permissions on the table in question
> 
> In addition, we have a separate method that just updates a single existing 
> Emissions and that method does store the changes properly in the database, so 
> we know that there is nothing preventing this object from being updated under 
> normal circumstances. 
> 
> So what could be causing this? Are there any known issues with JDO updates 
> inside a for() loop? 
> 
> Thanks,
> August
> 
> 
> 
>      
> 
> ---------------------------------------------------------------------
> To unsubscribe from this list, please visit:
> 
>    http://xircles.codehaus.org/manage_email
> 
> 

---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


      

---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


      

---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply via email to