我不确定在哪里打开我的Transaction
对象。在服务层内?还是控制器层?
我的Controller
基本上有两项服务,我们称之为AService
和BService
。然后我的代码就像:
public class Controller {
public AService aService = new AService();
public BService bService = new BService();
public void doSomething(SomeData data) {
//Transaction transaction = HibernateUtil.getSession().openTransaction();
if (data.getSomeCondition()) {
aService.save(data.getSomeVar1());
bService.save(data.getSomeVar2());
}
else {
bService.save(data.getSomeVar2());
}
//transaction.commit(); or optional try-catch with rollback
}
}
我想要的行为是,如果bService#save
失败,那么我可以调用transaction#rollback
,以便在aService
中保存的内容也会被回滚。如果我为两次保存创建一个单独的事务,这似乎是可能的。
但从另一个角度来看,我的Controller
依赖Transaction
看起来真的很难看。如果我在各自的服务中创建Transaction
会更好(比如Spring @Transactional的工作方式),但如果我这样做,那么我不知道如何实现我想要发生的事情...
答案 0 :(得分:3)
您可以通过另一层抽象和使用构图来完成您所要求的内容。
public class CompositeABService {
@Autowired
private AService aservice;
@Autowired
private BService bservice;
@Transactional
public void save(Object value1, Object value2) {
aservice.save( value1 );
bservice.save( value2 );
}
}
public class AService {
@Transactional
public void save(Object value) {
// joins an existing transaction if one exists, creates a new one otherwise.
}
}
public class BService {
@Transactional
public void save(Object value) {
// joins an existing transaction if one exists, creates a new one otherwise.
}
}
当您需要与多个存储库作为单个工作单元(例如事务)的一部分进行交互时,通常会使用相同的模式。
现在你的所有控制器都需要依赖CompositeABService
或你想要命名的任何东西。