Dziedziczenie JPA i polimorfizm EJB
Mam aplikację WWW Java EE 6 używającą transakcji zarządzanych przez kontener i kontekstu trwałości propagowanego przez kontener
@PersistenceContext
private EntityManager em;
W warstwie JPA mam strategię dziedziczenia, gdzieMyExtendedClassA
iMyEntendedClassB
oba rozciągają sięabstract MyClass
.
używamstateless
facade
klasy usług do implementacji dostępu do danych za pomocą metodfind
, findAll
, merge
, persist
, remove
:
@Stateless
public class MyExtendedClassAFacade {
@PersistenceContext
private EntityManager em;
public void persist(MyExtendedClassA a) {
// ...
}
// other methods
}
Jak na razie dobrze. Teraz muszę zaimplementować polimorfizm nazachowanie rozszerzonych klas. To zachowanie polega na zarządzaniu niektórymi innymi obiektami w bazie danych, więc potrzebuje PersistenceContext (i dlatego muszę użyć innychStateless
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);
}
}
}
Czy jest jakiś wzór abstrakcji, którego mogę użyć do tego celu?