Я использую UnitOfWork
в методе фоновой задачи (управляемом Quartz) с Guice-persist поверх hibernate.Фоновая задача вызывает службу, которая должна зафиксировать текущую транзакцию в середине своей задачи и продолжить другую транзакцию.Как я могу зафиксировать текущий 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
какis .
В идеале я не хочу менять подпись сервиса.Обходной путь для вызывающего абонента состоит в том, чтобы дать два 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() { ... }
}