JPA Наследование и EJB полиморфизм
У меня есть веб-приложение Java EE 6, использующее управляемые контейнером транзакции и распространяемый контейнером контекст сохраняемости через
@PersistenceContext
private EntityManager em;
На уровне JPA у меня есть стратегия наследования, гдеMyExtendedClassA
а такжеMyEntendedClassB
оба расширяютсяabstract MyClass
.
я используюstateless
facade
классы обслуживания для реализации доступа к данным через методыfind
, findAll
, merge
, persist
, remove
:
@Stateless
public class MyExtendedClassAFacade {
@PersistenceContext
private EntityManager em;
public void persist(MyExtendedClassA a) {
// ...
}
// other methods
}
Все идет нормально. Теперь я должен реализовать полиморфизм наbehavior расширенных классов. Это поведение заключается в управлении некоторыми другими объектами в базе данных, поэтому требуется PersistenceContext (и, следовательно, мне нужно использовать другиеStateless
EJBs):
@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);
}
}
}
Есть ли какой-либо шаблон абстракции, который я могу использовать для этой цели?