我是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注释呢?
请帮助我解决这个问题。
发布于 2018-07-24 03:43:36
它是否更新了相同的行而不是两个不同的行?如果您认为这是错误的,那么请考虑@Transactional
注释定义了附加到持久性上下文的单个事务的范围。
因此,当您使用相同的对象、设置或更改时,假设对象的不同属性,底层JPA会检测到它基本上与您试图更新的对象相同。因此,与两个update查询不同,只运行一个update语句,即最新的/最后一个update语句,并且只有该更改会反映在数据库中。
https://stackoverflow.com/questions/51485254
复制相似问题