我正在使用UnitOfWork
Guice-persist 在休眠之上的后台任务方法(由 Quartz 操作)。后台任务调用一个服务,该服务需要在其任务中间提交当前事务 - 并继续另一个事务。如何提交当前的 UnitOfWork 并创建一个新的?
class BackgroundJob {
@Inject UnitOfWork unitOfWork;
@Inject MyService myService;
public void run() {
try {
unitOfWork.begin();
myService.foo();
} finally {
unitOfWork.end();
} } }
class MyServiceImpl implements MyService {
@Override public void foo() {
foo1();
// I would like to commit here and start a new transaction
foo2();
} }
该服务也由 Guice 管理,但它是一个单例,并且无法按原样访问调用UnitOfWork
者。
理想情况下,我不想更改服务签名。一种解决方法是让调用者将两个UnitOfWork
作为参数提供给foo()
,但这似乎有点被黑了。
编辑:为了方便未来的读者使用,这是我对 ColinD 给出的解决方案的实现,它非常符合要求:
class BackgroundJob {
@Inject UnitOfWork unitOfWork;
@Inject MyService myService;
public void run() {
try {
unitOfWork.begin();
myService.foo();
} finally {
unitOfWork.end();
} } }
class MyServiceImpl implements MyService {
@Override public void foo() {
foo1();
foo2();
}
@Transactional private void foo1() { ... }
@Transactional private void foo2() { ... }
}