【问题标题】:hibernate hbm: automatic (unwanted) update foundhibernate hbm:发现自动(不需要的)更新
【发布时间】:2015-03-07 13:48:48
【问题描述】:

在我的项目中,我使用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=?

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

【问题讨论】:

  • 第二次查询是否影响数据库中的记录?
  • @GuillaumeS 是的,它会影响数据库中的记录
  • 但它只是更新 token_otp ?
  • @GuillaumeS 它会更新其他列
  • @GuillaumeS 我找到了解决方案,请参阅我的答案

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


【解决方案1】:

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

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

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

希望对你有帮助。

谢谢

【讨论】:

  • “避免在会话刷新期间或事务完成时由休眠执行的第二次执行。”和????
【解决方案2】:

我通过在hbm.xml 文件中添加:dynamic-update="true" 来解决这个问题

我找到了解决方案here

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 2016-10-25
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    相关资源
    最近更新 更多