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();
} }
UnitOfWork
このサービスも Guice によって管理されますが、シングルトンであり、そのまま呼び出し元にアクセスすることはできません。
理想的には、サービス署名を変更したくありません。回避策は、呼び出し元が にUnitOfWork
パラメーターとして2 つを与えること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() { ... }
}