pol*_*lis 1 java spring hibernate jpa spring-data
最近一直在用Spring boot + spring data jpa + hibernate。我在 spring 事务中遇到了一个问题。这是我的服务类和两个问题:
@Transactional
@Service
class MyService {
@Autowired
private MyRepository myRep;
public void method_A() {
try {
method_C();
.....
method_B();
} catch(Exception e) {}
}
public void method_B() {
Entity e = new Entity();
e.set(...);
myRep.save(e);
}
public void method_C() throws Exception {
....
}
}
Run Code Online (Sandbox Code Playgroud)
1.如果方法method_C()抛出异常,我想捕获它并记录它,事务不会在方法中回滚method_B(),因为异常没有到达Spring框架。那么我应该怎么做才能捕获异常method_C()并同时不失去method_B()回滚方法的能力?
2.考虑新方法method_A()。
public void method_A() {
for(...) {
...
...
method_B();
}
}
Run Code Online (Sandbox Code Playgroud)
我想method_B()在循环中调用。如果在method_B()我希望事务method_B()被回滚但method_A()不应退出并且循环应继续执行中发生异常。我怎样才能做到这一点?
我以这种方式解决了我的两个问题:创建了另一个@Service类并method_B()进入了它。我已经将这个类注释为@Transactional. 现在该方法method_A()如下所示:
public void method_A() {
for(...) {
...
try {
anotherService.method_B();
} catch (Exception e) {
logger.error(...);
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果RuntimeException发生在method_B()方法中,异常被正确记录,事务method_B()被回滚并且循环继续。谢谢大家的回复。
| 归档时间: |
|
| 查看次数: |
6046 次 |
| 最近记录: |