【问题标题】:Hibernate @Transactional休眠@Transactional
【发布时间】:2018-12-31 06:53:23
【问题描述】:

我是hibernate新手,如何在spring中使用@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;见相关讨论here
  • Spring AOP 仅在从外部调用时才起作用。您在内部调用 update 方法绕过代理,基本上忽略了 @Transactional

标签: java spring hibernate jpa spring-transactions


【解决方案1】:

它是否更新了同一行而不是两个不同的行?如果这就是您所说的错误,那么请考虑 @Transactional 注释定义了附加到持久性上下文的单个事务的范围。

因此,当您使用相同的对象、设置或更改时,假设对象的不同属性,底层 JPA 检测到它基本上是您尝试更新的相同对象。因此,不是两个更新查询,而是只运行一个最新/最后一个更新语句,并且只有该更改才会反映在数据库中。

【讨论】:

  • 我正在更新同一张表但不同(两)行。有可能吗?
猜你喜欢
  • 1970-01-01
  • 2015-11-09
  • 2014-11-25
  • 2015-06-23
  • 2013-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-05
相关资源
最近更新 更多