Hibernate:为什么我在每次插入一对多关系后都会得到更新?

Zhe*_*nch 5 mapping hibernate insert updates

我不明白我的休眠映射设置中哪些配置不正确。\n插入后很多次,我对包含在一对多关系中的链接表进行了更新。

\n\n

我不想要这个更新。\n我认为更新可能与级联或反向关键字有关......

\n\n

在我的示例中,我有 4 个类 AnalyseResult、VariationResult、Variation 和 VariationAnnotationNGS。

\n\n

AnalyseResult 可以有许多 VariationResults 子级。\n一个父 Variation 可以有多个 VariationResultChildren。\nVariation 可以有许多 VariationAnnotationNGS 子项。

\n\n

当我尝试插入新的 AnalyseResult 并附加所有子对象时,执行类似的操作

\n\n
\n

方法注释@Transactionnal\n AnalyseResultBo.save() {AnalyseResultDao.save() }

\n
\n\n

对于每个新的 VariationResult 插入,都会更新 Variation。(变化已经存储(持久化)在数据库中并重新附加到瞬态对象 VariationResult。

\n\n

这是我的映射。我需要更改什么才能使更新在插入后消失?

\n\n

谢谢

\n\n
         <!--AnalyseResult -->\n        <class name="com.clb.genomic.lyon.model.analysis.AnalyseResult" table="CORE_analyseResult"  >\n\n          <set name="ngsVariationResults" table="NGS_variationResult"  inverse="true" lazy="true"  cascade="all">\n               <key>\n               <column name="id_analyseResult_fk" not-null="true"  />\n               </key> \n               <one-to-many class="com.clb.genomic.lyon.model.ngs.VariationResultNGS" />\n          </set>\n\n         </class>\n\n      <!--VariationResultNGS -->\n      <class name="com.clb.genomic.lyon.model.ngs.VariationResultNGS" table="NGS_variationResult" >\n\n         <many-to-one name="analyseResult" class="com.clb.genomic.lyon.model.analysis.AnalyseResult" cascade="all" >\n            <column name="id_analyseResult_fk" not-null="true" /> \n        </many-to-one>\n\n        <many-to-one name="variation" class="com.clb.genomic.lyon.model.ngs.VariationNGS"  cascade="all" > <!-- cascade="all" enlever \xc3\xa9vite le update mais fait foire le insert completement-->\n            <column name="id_variation_fk" not-null="true" /> \n        </many-to-one>       \n\n       </class>\n\n       <!--Variation-->\n       <class name="com.clb.genomic.lyon.model.ngs.VariationNGS" table="NGS_variation" >\n\n       <set name="variationAnnotations" table="NGS_variationAnnotationEav"  inverse="true" lazy="false"  cascade="all">\n            <key>\n                <column name="id_variation_fk" not-null="true"  />\n            </key> \n            <one-to-many class="com.clb.genomic.lyon.model.ngs.VariationAnnotationNGS" />\n        </set>\n\n         <set name="variationResults" table="NGS_variationResult"  inverse="true" lazy="true" cascade="all">\n            <key>\n                <column name="id_variation_fk" not-null="true"  />\n            </key> \n            <one-to-many class="com.clb.genomic.lyon.model.ngs.VariationResultNGS" />\n        </set>\n\n     </class>\n\n     <!--VariationAnnotationNGS -->\n     <class name="com.clb.genomic.lyon.model.ngs.VariationAnnotationNGS" table="NGS_variationAnnotationEav" >\n\n       <many-to-one name="variation" class="com.clb.genomic.lyon.model.ngs.VariationNGS" cascade="all">\n            <column name="id_variation_fk" not-null="true" /> \n        </many-to-one> \n\n     </class>\n\n</hibernate-mapping>\n
Run Code Online (Sandbox Code Playgroud)\n\n

生成的查询:

\n\n
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 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n\nHibernate: 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 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n\nHibernate: update NGS_variation set nucleotide_change=?, aminoAcid_Change=?, ref=?, alt=?, chr=?, position=?, strand=?, analyseDict_version=? where id=?\n\nHibernate: update NGS_variation set nucleotide_change=?, aminoAcid_Change=?, ref=?, alt=?, chr=?, position=?, strand=?, analyseDict_version=? where id=?\n
Run Code Online (Sandbox Code Playgroud)\n

Man*_*ubi 1

这是因为您指定cascade="all"这使得操作能够级联到子实体,从而创建额外的更新语句。

如果您希望防止 hibernate 对子实体进行级联操作,请在标签cascade="none"中使用以下内容one-to-many set

更多信息

Hibernate 文档:第 7 章. 集合映射