在我的项目中,我使用hibernate hbm
和spring
,我运行sql
查询来更新单个列,
Query sql = getSession().createSQLQuery("update HISTORIQUE_DETAIL_APPELS set token_otp = '"+historiqueDetailAppelsVO.getCodeOtp()+"' where id = '"+historiqueDetailAppelsVO.getId()+"'");
try {
sql.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}
我发现执行了另一个查询并更新了数据库中的表,
Hibernate: update HISTORIQUE_DETAIL_APPELS set token_otp = '14d3fc' where id = '150017'
Hibernate: update HISTORIQUE_DETAIL_APPELS set cod_cent=?, adresse_ip=?, id_conseiller=?, type_piece=?, num_piece_ident=?, msisdn=?, mois1_detail=?, mois2_detail=?, mois3_detail=?, date_demande=?, no_ticket_caisse=?, date_ticket=?, cod_user=?, dat_maj=?, flag_imp_data=?, date_imp_data=?, token_otp=?, send_mail=?, client_mail=?, date_debut=?, date_fin=? where id=?
第二次更新的来源在哪里?
答案 0 :(得分:1)
之前我遇到过同样的问题,经过一些研究后发现:
当用户使用基于直接查询的操作更新任何记录时,它会直接更新到数据库。 但是,如果当前会话中已经存在相同的记录(先前副本)(之前由用户在当前会话中读取),则数据库记录(由基于查询的操作更新)与当前会话记录之间存在差异因此,在刷新会话或完成事务时,hibernate再次运行更新查询以更新会话记录。
避免在刷新会话期间或在事务完成时由休眠执行第二次执行。
我希望它会对你有所帮助。
由于
答案 1 :(得分:1)
我通过在dynamic-update="true"
文件
hbm.xml
来解决此问题
我找到了解决方案here:
" dynamic-update属性告诉Hibernate是否要包含 SQL UPDATE语句中未修改的属性。"