簡體   English   中英

休眠@Transactional

[英]Hibernate @Transactional

我是休眠的新手,如何在春季使用@Transactional,

這是INF課,

@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackForClassName = {
"com.framework.exceptions.ApplicationException" })
public ServiceObject create(ServiceObject dtObject) throws ApplicationException;

@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackForClassName = {
        "com.framework.exceptions.ApplicationException" })
public ServiceObject update(ServiceObject dtObject) throws ApplicationException;

實現類

public ServiceObject read(ServiceObject dtObject) throws ApplicationException {
    try {

            if (dtObject.getDataObject() != null) {
                CustomersEntity customersEntity = (CustomersEntity) dtObject.getDataObject();
                String captchaStr = customersEntity.getCaptchaString();
                if (captchaStr != null && !captchaStr.isEmpty()) {
                    customersEntity.setCaptchaType(captchaStr.split(",", 2)[0]); 
                    customersEntity.setCaptcha(captchaStr.split(",", 2)[1].getBytes());
                    customersEntity.setCaptchaString(null);
                    customersEntity.setUpdatedOn(DateUtil.getISTTodayDate());
                    if(customersEntity.getResult() == null || customersEntity.getResult().isEmpty()){
                        customersEntity.setWip((byte) 0); // if user not submit the captcha value
                    }
                    dtObject.setDataObject(customersEntity);
                    update(dtObject);

                    CustomersEntity customersEntity2 = (CustomersEntity) dtObject.getDataObject();
                    customersEntity2.setUserId(customersEntity2.getSolvedBy());
                    customersEntity2.setUpdatedOn(DateUtil.getISTTodayDate());
                    dtObject.setDataObject(customersEntity2);
                    CustomersEntity customersEntity3 = getCaptcha(dtObject);
                    if (customersEntity3 != null) {
                        byte[] imgByte = customersEntity3.getCaptcha();
                        customersEntity3
                                .setCaptchaString(customersEntity3.getCaptchaType() + "," + new String(imgByte));
                        customersEntity3.setWip((byte) 1);
                        customersEntity3.setUpdatedOn(DateUtil.getISTTodayDate());
                        dtObject.setDataObject(customersEntity3);
                        update(dtObject);
                    } else {
                        dtObject.setMessage("No captcha, please try again after some time.");
                        dtObject.setSuccess(false);
                    }
                } else {
                    dtObject.setMessage("Pls try again.");
                    dtObject.setSuccess(false);
                }
            }

    } catch (Exception e) {
        dtObject.setSuccess(false);
        throw new ApplicationException(e.getMessage(), e);
    }
    return dtObject;
}

@Override
public ServiceObject update(ServiceObject dtObject) throws ApplicationException {
    try {
            customersDao.update((CustomersEntity) dtObject.getDataObject());
            dtObject.setMessage("Record updated successfully.");
            dtObject.setSuccess(true);

    } catch (Exception e) {
        dtObject.setSuccess(false);
        throw new ApplicationException(e.getMessage(), e);
    }
    return dtObject;
}

在調用read(...)方法時,在內部調用了update(...)方法兩次,但結果將是在具有不同行的單個表中進行兩次不同的更新,但更新錯誤。

因此,如何使用@Transactional批注。

請幫助我解決這個問題。

它更新的是同一行而不是兩個不同的行嗎? 如果這就是您所說的錯誤,那么請考慮@Transactional批注定義了附加到持久性上下文的單個事務的范圍。

因此,當您使用相同的對象(設置或更改)時,假設該對象的屬性不同,則基礎JPA會檢測到它基本上就是您要更新的同一對象。 因此,不是運行兩個更新查詢,而是運行一個最新/最后一個更新語句,並且只有該更改反映在數據庫中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM