hibernate hbm:发现自动(不需要的)更新

hibernate hbm: automatic (unwanted) update found

在我的项目中,我使用 hibernate hbmspring,我 运行 一个 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();
        }

我发现执行了另一个查询并更新了数据库中的table,

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=?

二次更新的源头在哪里?

我以前遇到过同样的问题,经过一番研究我发现:

当用户使用基于直接查询的操作更新任何记录时,它会直接更新到数据库中。 但是,如果相同的记录(以前的副本)已经存在于当前会话中(即用户先前在当前会话中读取过),则数据库记录(通过基于查询的操作更新)和当前会话记录之间会发生差异,因此,hibernate 在会话刷新或事务完成期间再次运行更新查询以更新会话记录。

为了避免 hibernate 在刷新会话期间或事务完成时执行第二次执行。

希望对你有所帮助

谢谢

我通过在 hbm.xml 文件

中添加 dynamic-update="true" 来解决这个问题

我找到了解决方案 here:

"The dynamic-update attribute tells Hibernate whether to include unmodified properties in the SQL UPDATE statement."