【发布时间】: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