我試圖通過拋出例外來回滾某些條件。但我找不到合適的方法來做到這一點。這是我的服務類
@Service
public class UserManager implements IUserManager {
private final IBasicEM basicEM;
public ApplicantInfoManager(IBasicEM basicEM) {
this.basicEM = basicEM;
}
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public boolean purgeUser(Long id) throws Exception {
//business logic
basicEM.Update(entity)
if(//condition) {
throw New RollBackException("//message")
}
//business logic
}
}
這是我的BasicEM班級
@Component
@Transactional(value = "transactionManager", rollbackFor = Exception.class)
public class BasicEM {
@PersistenceContext(unitName = "db1")
private EntityManager em;
public void update(Object target) {
em.merge(target);
}
}
所以我想要的是呼叫該update方法,然后如果條件為真,則撤消更新。我的意圖是當我拋出例外時,事務結束并且不提交更新。但我錯了,更新已經完成。請幫助我實作我的目標。
uj5u.com熱心網友回復:
為了實作你想要的,你需要在 Service 方法中已經有一個事務。的默認傳播型別@Transactional(value = "transactionManager", rollbackFor = Exception.class)是Propagation.REQUIRED這意味著如果您的服務已包含在交易中,則該服務basicEM.Update(entity)也將包含在此類交易中。
@Service
public class UserManager implements IUserManager {
private final IBasicEM basicEM;
public ApplicantInfoManager(IBasicEM basicEM) {
this.basicEM = basicEM;
}
@Override
@Transactional(value = "transactionManager",
propagation = Propagation.REQUIRES_NEW, rollbackFor = RollBackException.class)
public boolean purgeUser(Long id) throws Exception {
//business logic
basicEM.Update(entity)
if(//condition) {
throw New RollBackException("//message")
}
//business logic
}
}
如果RollBackException是 aRuntimeException您不需要顯式配置事務在拋出時應回滾。如果不是,則需要進行如下配置:@Transactional(value = "transactionManager", propagation = Propagation.REQUIRES_NEW, rollbackFor = RollBackException.class).
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/342770.html
