コンテナ管理のトランザクションとコンテナが伝播する永続コンテキストを使用する Java EE 6 Web アプリケーションがあります。
@PersistenceContext
private EntityManager em;
JPAレイヤーには、継承戦略があり、 whereMyExtendedClassA
とMyEntendedClassB
both extends abstract MyClass
.
メソッドによるデータ アクセスを実装するために、stateless
facade
サービス クラスを使用します。find
findAll
merge
persist
remove
@Stateless
public class MyExtendedClassAFacade {
@PersistenceContext
private EntityManager em;
public void persist(MyExtendedClassA a) {
// ...
}
// other methods
}
ここまでは順調ですね。ここで、拡張クラスの動作にポリモーフィズムを実装する必要があります。この動作は、データベース内の他のいくつかのエンティティを管理することで構成されているため、PersistenceContext が必要です (したがって、他のStateless
EJB を使用する必要があります)。
@Stateful
public class MyBean {
@EJB
private MyClassFacade myClassFacade; // stateless facade service class
public void doSomething() {
for (MyClass c : myClassFacade.findAll()) {
// here I need to perform operations on the db.
// The implementation differs on each extended class.
// I want to avoid a brute-force coding like:
if (c.getClass().equals(MyExtendedClassA.class)) {
@EJB MyExtendedClassAFacade myClassFacadeA;
myClassFacadeA.doSomething((MyExtendedClassA) c);
} else if (c.getClass().equals(MyExtendedClassB.class))
@EJB MyExtendedClassBFacade myClassFacadeB;
myClassFacadeB.doSomething((MyExtendedClassB) c);
}
// Instead, I would like to write something like:
@EJB AnotherStatelessBean asb;
asb.doSomething(c);
}
}
}
この目標に使用できる抽象化パターンはありますか?