【问题标题】:Hibernate Session not updating entity休眠会话不更新实体
【发布时间】:2020-02-16 05:44:59
【问题描述】:

如果实体的列值已经有值,则休眠会话不会更新该列值,如果它是 null 则没问题,会话正在保存新的更新。但是,如果实体的列已经有一个值并且我正在更新该列(不是通过 HSQL 查询,而是通过 setter),则会话不会更新数据库中的值。 例如:-

在我的网络应用程序中,我有一个患者列表。 Patient 实体有 3 列 -

姓名 |年龄 |医生

请注意Doctor是表中的外键
现在假设我从列表中单击 Assign 按钮,该按钮将调用一个仅分配 Doctor 的 API。

现在要注意了,如果患者说 A 在 DB 中没有医生在场(或分配给 A),我点击 Assign 进行设置up new Doctor,将调用 API 来为 A 设置 Doctor,它可以正常工作,没有任何问题。但现在假设我想将分配的医生更新为新医生。因此,我将再次单击按钮,从而再次调用 API,只是这次新的 Doctor 没有在 DB 中更新,而是 Doctor 列保持 (NULL)。如果我再试一次,它会设置新的 Doctor 值。

这是用于更新/设置电子邮件的 API 代码 -

 @POST
 @Path("/setDoctor/")
 @Produces(MediaType.APPLICATION_JSON)
 public JSONObject setDoctor(
    @FormParam('patientId') int patientId,
    @FormParam('DoctorId') int doctorId ){
Session session = HibernateSessionFactory.get().openSession();
session.beginTransaction();
Patient patient = (Patient) session.get(Patient.class, patientId);
patient.setDoctor((Doctor) session.get(Doctor.class,doctorId));
session.save(patient);
session.getTransaction().commit();
session.close();
}

因此,我能够得出的结论是,如果 Doctor 列是 null 并且调用了 API,则不会有任何问题。但是,如果 Doctor 列 ( Foreign Key ) 中存在值,并且调用 API,则会话不会更新新值,而是将值设置为 null .我

注意: 代码中没有弹出错误。尝试用 try/catch 包围它仍然没有错误。我也尝试将 session.save() 替换为 session.saveOrUpdate() 但仍然不行。

【问题讨论】:

  • 病人和医生的映射是什么样子的?请出示您的实体

标签: java mysql hibernate mysql-workbench


【解决方案1】:

只需在保存/更新之前附加此行,您需要在保存任何数据然后提交它之前开始一个事务。因此它必须处于其关键状态并且没有其他事务可以在同一特定时间更新数据(可能会导致歧义)

session.beginTransaction();
session.saveOrUpdate(s);

【讨论】:

    【解决方案2】:

    所以我想出了问题所在。所以问题是,由于两个 api 被调用 - 它被同时调用,即异步。所以不得不停下来,我在 API 中所做的是禁用 API 的异步调用 -

    Ext.Ajax.request({
    
    async: false,
    url: webServiceUrl+'/setDoctor/',
    method: 'POST',
    params:{
    

    因此,通过在 API 调用中提供 async: false 可以防止并行重叠。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-12
      • 2017-11-19
      • 2013-07-24
      • 2018-10-24
      • 1970-01-01
      • 1970-01-01
      • 2015-02-18
      相关资源
      最近更新 更多