ZheFrench
ZheFrench

Reputation: 1197

Hibernate : why do i get an update after each insert in one-to-many relationship?

I don't understand what is not well configured in my settings in hibernate mappings. Many times after Insert, i have updates on linked tables inclued in one-to-many relationship.

I don't want this updates. I think the update is something related with cascade or inverse keyword maybe...

In my example, I have 4 classes AnalyseResult,VariationResult, Variation & VariationAnnotationNGS.

AnalyseResult can have many VariationResults children. One parent Variation can have many VariationResultChildren. Variation can have many VariationAnnotationNGS children.

When i tried to insert new AnalyseResult with all children objets attached doing something like

method annoted @Transactionnal AnalyseResultBo.save() {AnalyseResultDao.save() }

For each new VariationResult insert, there is an update of Variation. (Variation are already stored(persisted) in DB and reatached to transcient object VariationResult.

This is my mapping. What does i need to change to make the update disapear after insert ?

thanks

         <!--AnalyseResult -->
        <class name="com.clb.genomic.lyon.model.analysis.AnalyseResult" table="CORE_analyseResult"  >

          <set name="ngsVariationResults" table="NGS_variationResult"  inverse="true" lazy="true"  cascade="all">
               <key>
               <column name="id_analyseResult_fk" not-null="true"  />
               </key> 
               <one-to-many class="com.clb.genomic.lyon.model.ngs.VariationResultNGS" />
          </set>

         </class>

      <!--VariationResultNGS -->
      <class name="com.clb.genomic.lyon.model.ngs.VariationResultNGS" table="NGS_variationResult" >

         <many-to-one name="analyseResult" class="com.clb.genomic.lyon.model.analysis.AnalyseResult" cascade="all" >
            <column name="id_analyseResult_fk" not-null="true" /> 
        </many-to-one>

        <many-to-one name="variation" class="com.clb.genomic.lyon.model.ngs.VariationNGS"  cascade="all" > <!-- cascade="all" enlever évite le update mais fait foire le insert completement-->
            <column name="id_variation_fk" not-null="true" /> 
        </many-to-one>       

       </class>

       <!--Variation-->
       <class name="com.clb.genomic.lyon.model.ngs.VariationNGS" table="NGS_variation" >

       <set name="variationAnnotations" table="NGS_variationAnnotationEav"  inverse="true" lazy="false"  cascade="all">
            <key>
                <column name="id_variation_fk" not-null="true"  />
            </key> 
            <one-to-many class="com.clb.genomic.lyon.model.ngs.VariationAnnotationNGS" />
        </set>

         <set name="variationResults" table="NGS_variationResult"  inverse="true" lazy="true" cascade="all">
            <key>
                <column name="id_variation_fk" not-null="true"  />
            </key> 
            <one-to-many class="com.clb.genomic.lyon.model.ngs.VariationResultNGS" />
        </set>

     </class>

     <!--VariationAnnotationNGS -->
     <class name="com.clb.genomic.lyon.model.ngs.VariationAnnotationNGS" table="NGS_variationAnnotationEav" >

       <many-to-one name="variation" class="com.clb.genomic.lyon.model.ngs.VariationNGS" cascade="all">
            <column name="id_variation_fk" not-null="true" /> 
        </many-to-one> 

     </class>

</hibernate-mapping>

The query generated :

Hibernate: insert into NGS_variationResult (id_analyseResult_fk, id_variation_fk, shift, shift_confiance, shift_type, coverage, a_obs, c_obs, g_obs, t_obs, filter_tool, filter_custom, is_automat_valid, is_research_valid, is_clinic_valid, comment) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

Hibernate: insert into NGS_variationResult (id_analyseResult_fk, id_variation_fk, shift, shift_confiance, shift_type, coverage, a_obs, c_obs, g_obs, t_obs, filter_tool, filter_custom, is_automat_valid, is_research_valid, is_clinic_valid, comment) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

Hibernate: update NGS_variation set nucleotide_change=?, aminoAcid_Change=?, ref=?, alt=?, chr=?, position=?, strand=?, analyseDict_version=? where id=?

Hibernate: update NGS_variation set nucleotide_change=?, aminoAcid_Change=?, ref=?, alt=?, chr=?, position=?, strand=?, analyseDict_version=? where id=?

Upvotes: 5

Views: 3927

Answers (1)

Manar Droubi
Manar Droubi

Reputation: 184

This is because you specified cascade="all" this enables operations to cascade to child entities thus creating the extra update statements.

if you wish to prevent hibernate from cascading operations to child entities use the following cascade="none" in your one-to-many set tags

more information

Hibernate Documentations: Chapter 7. Collection mapping

Upvotes: 1

Related Questions