私の Java SE/Java EE アプリケーションには、単純な CRUD 操作を可能にするエンティティ マネージャーをラップする DAO インターフェイスがあります。また、単純な CRUD 操作をバッチ操作として実行できるようにする拡張 DAO インターフェイスもあります。つまり、すべての操作が同じトランザクションで実行されます。これにより、順次 CRUD 操作の 1 つが失敗した場合にロールバックできます。
public interface DomEntityManager {
void createEntity(Object aEntity) throws TransactionException;
void deleteEntity(Object aEntity) throws TransactionException;
void updateEntity(Object aEntity) throws TransactionException;
<T> T findById(int aId, Class<T> aClass);
<T> T getNewEntity(Class<T> aClass) throws TransactionException;
}
public interface BatchDomEntityManager extends DomEntityManager {
void execute(BatchTransation transaction);
}
public interface BatchTransaction {
public void run();
}
上記の設計で私が達成しようとしているのは、コードを呼び出すクライアントが execute BatchTransaction メソッド内の DomEntityManager 操作のいずれかを呼び出す場合、その操作で単一のトランザクションを使用することです。
現在、Dom エンティティ マネージャーの実装には単純な実装があり、リクエストごとにエンティティ マネージャーが作成され、新しいトランザクションが開始され、DAO メソッド内のリクエストの最後にコミットされます。共有エンティティマネージャーのケースをどのように実装できるかについて、私は少し行き詰まっています。ThreadLocal を使用する必要があります。その場合、実行トランザクション ブロックを別のスレッドで実行する必要があります。トランザクションが完了するまで実行呼び出しをブロックしても問題ありません。
提案をありがとう。