Reputation: 1197
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
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