StoredProcedureQuery не возвращает ожидаемый выходной параметр в JPA - PullRequest
0 голосов
/ 04 февраля 2020

У меня проблема с вызовом хранимой процедуры с использованием StoredProcedureQuery из hibernate-jpa-2.1 и postgresql, вот мой java код:

public String updateSO(String salesorderID, String ahassCode) {
         EntityManager em = this.entityManagerFactory.createEntityManager();     
        try{
            String message="";                  
            em.getTransaction().begin();
            StoredProcedureQuery call = em.createStoredProcedureQuery("update_status_so"); 
            call.registerStoredProcedureParameter("dealercode",String.class, ParameterMode.IN); 
            call.registerStoredProcedureParameter("salesorderid_update",String.class, ParameterMode.IN); 
            call.registerStoredProcedureParameter("message_value",String.class, ParameterMode.OUT); 
            call.setParameter("dealercode", ahassCode);
            call.setParameter("salesorderid_update", salesorderID);
            message=(String)call.getOutputParameterValue("message_value");            
            em.getTransaction().commit(); 
            em.clear();
            em.close();
        } catch (Exception e) {
            e.printStackTrace();
            em.close();
        }
}

, а вот моя хранимая процедура:

CREATE OR REPLACE FUNCTION public.update_status_so(
    dealercode text,
    salesorderid_update text,
    OUT message_value text)
    RETURNS text
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE SECURITY DEFINER 
AS $BODY$
DECLARE so_updated character varying;
BEGIN
    case when exists (select salesorderid from public.trx_salesorder where salesorderid=salesorderid_update and ahasscode=dealercode and salesorderlastknownstatus='DRAFT')
    then 
    update public.trx_salesorder set salesorderlastknownstatus='BOOK' where salesorderid=salesorderid_update and ahasscode=dealercode and salesorderlastknownstatus='DRAFT';
    message_value='data updated to BOOK';
    else 
    message_value='data already submited';
    end case;
END;
$BODY$;

В моем случае я открываю свое приложение в двух браузерах (chrome и firefox) с одинаковой позицией (обновить данные) и одинаковыми данными, когда я нажимаю кнопку обновления на firefox данных в база данных изменилась, и я получаю сообщение = "данные обновлены в КНИГУ", но когда я снова нажимаю кнопку обновления на chrome, она должна вернуть сообщение = "данные уже отправлены", но всегда возвращает сообщение = "данные обновлены в КНИГУ", что я пропустил?

...