你能告诉我如何只为某些代码块运行事务?我有@Transactional的服务函数,从中我调用存储库函数执行查询。但是当查询失败时,它也失败了服务功能,因为必须结束事务。那么当存储库函数失败时,我怎么能返回null值?失败时我需要捕获空值,并继续一些逻辑。我的代码:
public class SomeService{
@Autowired
SomeRepository repo;
@Transactional
public int getSomeValue(){
MyObj obj = repo.getLastItem(); // this failed because not items in table, so I need here null
if (obj != null) {
//some calculations
return [calculatedValue]
} else {
return 1
}
}
}
修改 我试过@davidxxx的答案,我收到了这个错误:
交易仅标记为回滚;不能承诺;嵌套异常是javax.persistence.PersistenceException:org.hibernate.TransactionException:事务已标记为仅回滚;无法提交
答案 0 :(得分:0)
您可以在try/catch
语句中包含可能引发异常的代码,并指定您不希望对此特定异常进行回滚:
public static final int DEFAULT_VALUE_WHEN_GET_LAST_ITEM_FAILED = 1;
...
@Transactional(rollbackFor = ExpectedException.class)
public int getSomeValue(){
try {
MyObj obj = repo.getLastItem(); // this failed because not items in table, so I need here null
if (obj != null) {
return calculatedValue();
}
}
catch(ExpectedException e){
//TODO exception logging
}
return DEFAULT_VALUE_WHEN_LAST_ITEM_FAILED;
}