JPA-Vererbung und EJB-Polymorphismus
Ich habe eine Java EE 6-Webanwendung, die containergesteuerte Transaktionen und den containerpropagierten Persistenzkontext verwendet
@PersistenceContext
private EntityManager em;
In der JPA-Ebene habe ich eine Vererbungsstrategie, woMyExtendedClassA
undMyEntendedClassB
beide verlängernabstract MyClass
.
ich benutzestateless
facade
Serviceklassen zur Implementierung des Datenzugriffs über die Methodenfind
, findAll
, merge
, persist
, remove
:
@Stateless
public class MyExtendedClassAFacade {
@PersistenceContext
private EntityManager em;
public void persist(MyExtendedClassA a) {
// ...
}
// other methods
}
So weit, ist es gut. Jetzt muss ich einen Polymorphismus auf die implementierenVerhalten der erweiterten Klassen. Dieses Verhalten besteht darin, einige andere Entitäten in der Datenbank zu verwalten. Daher wird der PersistenceContext benötigt (und daher muss ich einen anderen verwendenStateless
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);
}
}
}
Gibt es ein Abstraktionsmuster, das ich für dieses Ziel verwenden kann?