Hibernate Session не обновляет сущность - PullRequest
0 голосов
/ 19 октября 2019

Сеанс Hibernate не обновляет значение столбца объекта, если столбец уже имеет значение, если он равен null , то нет проблем, сеанс сохраняет новое обновление. Однако, если столбец сущности уже имеет значение, и я обновляю столбец (не по запросу HSQL, а по установщику), сеанс не обновляет значение в базе данных. Например: -

В моем веб-приложении, скажем, есть список пациентов. А у сущности «Пациент» есть 3 столбца -

Имя |Возраст |Доктор

Обратите внимание, что Доктор является внешним ключом в таблице
Теперь предположим, что из списка, который я нажимаю, Назначить *Кнопка 1017 *, которая вызовет API, который назначит только доктора.

Теперь здесь есть уловка, если пациент, скажем, A не имеет доктора (или назначен)а) в БД, и я нажимаю Назначить для настройки нового Доктора, будет вызван API, который установит Доктора для A , который будет работать без проблем. Но теперь, допустим, я хочу обновить назначенного Доктора новым. Поэтому я бы снова нажал на кнопку, чтобы снова вызывать API, только на этот раз новый Доктор не обновляется в БД, вместо этого столбец Доктор остается (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();
}

Таким образом, проблема, которая у меня естьудалось сделать вывод, что если столбец «Доктор» равен null и вызывается API, проблем не будет. Но если в столбце «Доктор» есть значение ( Внешний ключ ), и API называется сеансом, он не обновляет новое значение, а устанавливает значение null . I

Примечание: Нет ошибок в коде. Пробовал, окружив его try / catch все еще без ошибок. Я также попытался заменить session.save () на session.saveOrUpdate () , но все равно не работает.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2019

так что я разобрался в чем проблема. Таким образом, проблема заключалась в том, что, поскольку вызывается два API - он вызывается одновременно, то есть асинхронно. Поэтому пришлось остановиться на том, что то, что я сделал в API, отключило асинхронный вызов API -

Ext.Ajax.request({

async: false,
url: webServiceUrl+'/setDoctor/',
method: 'POST',
params:{

Так что, указав async: false в вызове API, это предотвратит параллельное перекрытие.

0 голосов
/ 19 октября 2019

Просто добавьте эти строки перед сохранением / обновлением, вам нужно начать транзакцию, прежде чем сохранять какие-либо данные и затем фиксировать их. Так что они должны находиться в критическом состоянии, и никакая другая транзакция не может обновить данные в одно и то же конкретное время (чтоможет вызвать двусмысленность)

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