hibernate hbm:找到自动(不需要的)更新

时间:2015-01-09 09:17:03

标签: java spring hibernate java-ee hibernate-criteria

在我的项目中,我使用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();
        }

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

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

第二次更新的来源在哪里?

2 个答案:

答案 0 :(得分:1)

之前我遇到过同样的问题,经过一些研究后发现:

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

避免在刷新会话期间或在事务完成时由休眠执行第二次执行。

我希望它会对你有所帮助。

由于

答案 1 :(得分:1)

我通过在dynamic-update="true"文件

中添加hbm.xml来解决此问题

我找到了解决方案here

  

" dynamic-update属性告诉Hibernate是否要包含   SQL UPDATE语句中未修改的属性。"